HandlerInterceptor拦截器使用总结
轉(zhuǎn)載自?https://blog.csdn.net/weixin_36832313/article/details/79115693
簡(jiǎn)介
SpringMVC的處理器攔截器,類似于Servlet開(kāi)發(fā)中的過(guò)濾器Filter,用于對(duì)請(qǐng)求進(jìn)行攔截和處理。
常見(jiàn)應(yīng)用場(chǎng)景
1、權(quán)限檢查:如檢測(cè)請(qǐng)求是否具有登錄權(quán)限,如果沒(méi)有直接返回到登陸頁(yè)面。?
2、性能監(jiān)控:用請(qǐng)求處理前和請(qǐng)求處理后的時(shí)間差計(jì)算整個(gè)請(qǐng)求響應(yīng)完成所消耗的時(shí)間。?
3、日志記錄:可以記錄請(qǐng)求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)等。
使用方法
1、配置文件
<mvc:interceptors><!--對(duì)所有的請(qǐng)求記性攔截--><!--<beans:beanclass="com.sunp.common.interceptor.Myinterceptor"/>--><!--對(duì)特定的請(qǐng)求進(jìn)行攔截--><mvc:interceptor><!--進(jìn)行攔截的路徑--><mvc:mapping path="/**"/> <!--不進(jìn)行攔截的路徑--> <mvc:exclude-mapping path="/lib/**" /> <beans:bean class="com.sunp.common.interceptor.Myinterceptor"/></mvc:interceptor> </mvc:interceptors>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2、實(shí)現(xiàn)接口并繼承方法(可以同時(shí)包含多個(gè)實(shí)現(xiàn)類)
public class myInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandler(HttpServletRequest request, HttpServletResponse response, Object obj)throws Exception{/*該方法將在請(qǐng)求處理之前進(jìn)行調(diào)用,只有該方法返回true,才會(huì)繼續(xù)執(zhí)行后續(xù)的Interceptor和Controller,當(dāng)返回值為true 時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor的preHandle 方法,如果已經(jīng)是最后一個(gè)Interceptor的時(shí)候就會(huì)是調(diào)用當(dāng)前請(qǐng)求的Controller方法;*/}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object obj,Exception e)throws Exception {/*該方法將在請(qǐng)求處理之后,DispatcherServlet進(jìn)行視圖返回渲染之前進(jìn)行調(diào)用,可以在這個(gè)方法中對(duì)Controller 處理之后的ModelAndView 對(duì)象進(jìn)行操作。*/}@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2,ModelAndView arg3) throws Exception {/*該方法也是需要當(dāng)前對(duì)應(yīng)的Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行,該方法將在整個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行。用于進(jìn)行資源清理。*/} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
執(zhí)行順序
1、單個(gè)實(shí)現(xiàn)類的執(zhí)行順序
preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
2、多個(gè)實(shí)現(xiàn)類的執(zhí)行順序
———————preHandler1——————-?
———————preHandler2——————-?
———————preHandler3——————-?
———————–Controller———————?
———————postHandler3——————?
———————postHandler2——————?
———————postHandler1——————?
———————postHandler1——————?
——————afterCompletion3—————-?
——————afterCompletion2—————-?
——————afterCompletion1—————-
簡(jiǎn)單練習(xí)代碼
http://download.csdn.net/download/weixin_36832313/10215829
---------------------------------------------------------------------------------
package com.ibank.admin.ws.interceptor;
import com.ibank.admin.service.AdminRedisService;
import com.tasfe.framework.redis.RedisService;
import com.tasfe.framework.support.model.ResponseData;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
?* Created by Dengw on 2018/1/4
?*/
@Component
public class LoginInteceptor implements HandlerInterceptor{
? ? private static Logger logger = LoggerFactory.getLogger(LoginInteceptor.class);
? ? @Autowired
? ? private AdminRedisService adminRedisService;
? ? @Override
? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
? ? ? ? String accountNo = request.getHeader("accountNo");
? ? ? ? String token = request.getHeader("token");
? ? ? ? boolean judgeFlag = adminRedisService.judgeTimeout(accountNo,token);
? ? ? ? if(!judgeFlag){
? ? ? ? ? ? response.setContentType("application/json");
? ? ? ? ? ? response.setCharacterEncoding("UTF-8");
? ? ? ? ? ? ResponseData responseData = ResponseData.error("登錄超時(shí),請(qǐng)重新登錄!");
? ? ? ? ? ? responseData.setStatus("2");
? ? ? ? ? ? PrintWriter printWriter = response.getWriter();
? ? ? ? ? ? printWriter.write(JSONObject.toJSONString(responseData));
? ? ? ? ? ? printWriter.flush();
? ? ? ? ? ? printWriter.close();
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return true;
? ? }
? ? @Override
? ? public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
? ? }
? ? @Override
? ? public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
? ? }
}
總結(jié)
以上是生活随笔為你收集整理的HandlerInterceptor拦截器使用总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 特殊格式的 汇潮支付接口对接
- 下一篇: Http请求中Content-Type讲