成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

攔截器的代碼Java 攔截器的代碼

java有什么注解前置前攔截

本文將用簡(jiǎn)潔的代碼構(gòu)建一個(gè)springboot的攔截器。攔截器的使用很簡(jiǎn)單,定義一個(gè)自己的攔截器,向配置中添加一下就可以使用。為了方便,之后又引入了注解。

創(chuàng)新互聯(lián)建站是一家專業(yè)從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)建站依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

目錄和概述

概述

假設(shè)需求:訪問項(xiàng)目的controller是都要進(jìn)行"token驗(yàn)證",除了某些像登錄之類的方法。

項(xiàng)目結(jié)構(gòu):

TokenInterceptor.java 自定義攔截器

InterceptorConfig.java 添加攔截器進(jìn)入項(xiàng)目

NoNeedToken.java 自定義注解

TestController.java 測(cè)試接口

1、自定義攔截器

在 TokenInterceptor.java 中輸入以下代碼,以下的代碼將生成一個(gè)在請(qǐng)求到達(dá)controller前進(jìn)行攔截的攔截器

import com.alibaba.fastjson.JSONObject;

import org.springframework.lang.Nullable;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.PrintWriter;

import java.util.Arrays;

import java.util.List;

@Component

public class TokenInterceptor implements HandlerInterceptor {undefined

// 假設(shè)現(xiàn)在的token有如下數(shù)據(jù)

List tokenList = Arrays.asList("111", "222", "333");

// 這個(gè)方法是在訪問接口之前執(zhí)行的,我們只需要在這里寫驗(yàn)證登陸狀態(tài)的業(yè)務(wù)邏輯,就可以在用戶調(diào)用指定接口之前驗(yàn)證登陸狀態(tài)了

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {undefined

// 設(shè)置返回為json格式,使用UTF-8

response.setCharacterEncoding("UTF-8");

response.setContentType("application/json; charset=utf-8");

String token = request.getHeader("token");

PrintWriter out;

// 之后寫你的判斷邏輯:return true是通過攔截器,可以繼續(xù)訪問controller,return false是不通過

if (token == null || !tokenList.contains(token)) {undefined

// 如果失敗了返回{state:"false", msg:"token is null or wrong"}

JSONObject res = new JSONObject();

res.put("state","false");

res.put("msg","token is null or wrong");

out = response.getWriter();

out.append(res.toString());

return false;

}

// 否則返回true 進(jìn)入controller

return true;

}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {undefined

}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {undefined

}

}

————————————————

版權(quán)聲明:本文為CSDN博主「魔王別囂張」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:

java如何實(shí)現(xiàn)攔截短信功能

java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供了一種機(jī)制可以使開發(fā)者在一個(gè)Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個(gè)Action

執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個(gè)方法或者字段被訪問之前,進(jìn)行攔截

然后再之前或者之后加入某些操作。目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可。

2,攔截器的原理

大部分時(shí)候,攔截器方法都是通過代理的方式來調(diào)用的。Struts2的攔截器實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts2的ServletDispatcher時(shí),Struts2

會(huì)查找配置文件,并根據(jù)配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表(List),最后一個(gè)一個(gè)的調(diào)用列表中的攔截器。Struts2的攔截器是可

插拔的,攔截器是AOP的一個(gè)實(shí)現(xiàn)。Struts2攔截器棧就是將攔截器按一定的順序連接成一條鏈。在訪問被攔截的方法或者字段時(shí),Struts2攔截器鏈

中的攔截器就會(huì)按照之前定義的順序進(jìn)行調(diào)用。

3,自定義攔截器的步驟

第一步:自定義一個(gè)實(shí)現(xiàn)了Interceptor接口的類,或者繼承抽象類AbstractInterceptor。

第二步:在配置文件中注冊(cè)定義的攔截器。

第三步:在需要使用Action中引用上述定義的攔截器,為了方便也可以將攔截器定義為默認(rèn)的攔截器,這樣在不加特殊說明的情況下,所有的

Action都被這個(gè)攔截器攔截。

4,過濾器與攔截器的區(qū)別

過濾器可以簡(jiǎn)單的理解為“取你所想取”,過濾器關(guān)注的是web請(qǐng)求;攔截器可以簡(jiǎn)單的理解為“拒你所想拒”,攔截器關(guān)注的是方法調(diào)用,比如攔截

敏感詞匯。

4.1,攔截器是基于java反射機(jī)制來實(shí)現(xiàn)的,而過濾器是基于函數(shù)回調(diào)來實(shí)現(xiàn)的。(有人說,攔截器是基于動(dòng)態(tài)代理來實(shí)現(xiàn)的)

4.2,攔截器不依賴servlet容器,過濾器依賴于servlet容器。

4.3,攔截器只對(duì)Action起作用,過濾器可以對(duì)所有請(qǐng)求起作用。

4.4,攔截器可以訪問Action上下文和值棧中的對(duì)象,過濾器不能。

4.5,在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時(shí)調(diào)用一次。

5,Spring攔截器

Java實(shí)現(xiàn)的攔截器

攔截器在在流行的開源框架中很常見 依賴的技術(shù)就是Java的動(dòng)態(tài)代理

理解攔截器的核心原理對(duì)理解這些開源框架的體系結(jié)構(gòu)至關(guān)重要

下面以一個(gè)簡(jiǎn)單的模型的來說明攔截器的實(shí)現(xiàn)的一般方法

模型分為以下模塊

業(yè)務(wù)組件 是被代理和被攔截的對(duì)象

代理處理器 實(shí)現(xiàn)了InvocationHandler接口的一個(gè)對(duì)象

代理對(duì)象 Proxy對(duì)象

攔截器 普通的JavaBean 在調(diào)用業(yè)務(wù)方法的之前或者之后會(huì)自動(dòng)攔截并執(zhí)行自己的一些方法

客戶端 執(zhí)行業(yè)務(wù)處理的入口

以下是模型的實(shí)現(xiàn)

一 業(yè)務(wù)組件 分為業(yè)務(wù)接口和業(yè)務(wù)類

/**

* 業(yè)務(wù)組件接口

*/

public interface BusinessInterface {

public void doSomething();

}

/**

* 業(yè)務(wù)組件

*/

public class BusinessClass implements BusinessInterface{

public void doSomething() {

System out println( 業(yè)務(wù)組件BusinessClass方法調(diào)用:doSomething() );

}

}

二 代理處理器 包含了業(yè)務(wù)對(duì)象綁定動(dòng)態(tài)代理類的處理 并實(shí)現(xiàn)了 InvocationHandler接口的invoke方法

import java lang reflect InvocationHandler;

import java lang reflect Method;

import java lang reflect Proxy;

/**

* 動(dòng)態(tài)代理處理器工具

*/

public class DynamicProxyHandler implements InvocationHandler {

private Object business;??? //被代理對(duì)象

private InterceptorClass interceptor = new InterceptorClass();??? //攔截器

/**

* 動(dòng)態(tài)生成一個(gè)代理類對(duì)象 并綁定被代理類和代理處理器

*

* @param business

* @return 代理類對(duì)象

*/

public Object bind(Object business) {

this business = business;

return Proxy newProxyInstance(

//被代理類 的ClassLoader

business getClass() getClassLoader()

//要被代理 的接口 本方法返回對(duì)象會(huì)自動(dòng)聲稱實(shí)現(xiàn)了這些接口

business getClass() getInterfaces()

//代理處理 器對(duì)象

this);

}

/**

* 代理要調(diào)用的方法 并在方法調(diào)用前后調(diào)用連接器的方法

*

* @param proxy? 代理類對(duì)象

* @param method 被代理的接口方法

* @param args?? 被代理接口方法的參數(shù)

* @return 方法調(diào)用返回的結(jié)果

* @throws Throwable

*/

public Object invoke(Object proxy Method method Object[] args) throws Throwable {

Object result = null;

interceptor before();

result=method invoke(business args);

interceptor after();

return null;? //To change body of implemented methods use File | Settings | File Templates

}

}

三 攔截器 普通的JavaBean 在調(diào)用業(yè)務(wù)方法的之前或者之后會(huì)自動(dòng)攔截并執(zhí)行自己的 一些方法

/**

* 攔截器

*/

public class InterceptorClass {

public void before(){

System out println( 攔截器InterceptorClass方法調(diào)用:before()! );

}

public void after(){

System out println( 攔截器InterceptorClass方法調(diào)用:after()! );

}

}

四 模擬客戶端 執(zhí)行業(yè)務(wù)處理的入口

/**

* 客戶端

*/

public class Client {

public static void main(String args[]) {

DynamicProxyHandler handler = new DynamicProxyHandler();

BusinessInterface business = new BusinessClass();

BusinessInterface businessProxy = (BusinessInterface) handler bind(business);

businessProxy doSomething();

}

lishixinzhi/Article/program/Java/hx/201311/27143

網(wǎng)站欄目:攔截器的代碼Java 攔截器的代碼
網(wǎng)站地址:http://jinyejixie.com/article28/ddcoscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、網(wǎng)站維護(hù)、全網(wǎng)營(yíng)銷推廣、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
五莲县| 利辛县| 固安县| 铜鼓县| 玉田县| 巴林右旗| 绥化市| 海阳市| 麟游县| 云霄县| 卫辉市| 洪湖市| 望江县| 南安市| 嘉荫县| 中江县| 谷城县| 根河市| 沈阳市| 湘西| 台江县| 富锦市| 崇左市| 乐清市| 元江| 南乐县| 尼勒克县| 竹山县| 房山区| 宜都市| 井研县| 新疆| 灵武市| 锡林郭勒盟| 将乐县| 原阳县| 江永县| 庆云县| 冷水江市| 民丰县| 霍城县|