攔截器HandlerInterceptorAdapter使用方法


一、Interceptor定義:
攔截器是在面向切面編程中應用的,就是在你的service或者一個方法前調用一個方法,或者在方法后調用一個方法。是基於JAVA的反射機制

1.攔截器(Interceptor)執行順序:
1. 請求到達 DispatcherServlet
2. DispatcherServlet 發送至 Interceptor ,執行 preHandle
3. 請求達到 Controller
4. 請求結束后,postHandle 執行

2.攔截器(Interceptor)和過濾器(Filter)的執行順序
過濾前->攔截前->Action處理->攔截后->過濾后

 3.使用方法
1)預處理preHandle()方法

用戶發送請求時,先執行preHandle()方法。會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以后所有攔截器都不會執行。若都是return true,則執行用戶請求的url方法。

2)后處理postHandle()方法

調用了Service並返回ModelAndView,但未進行頁面渲染,可以在這里繼續修改ModelAndView

3)返回處理afterCompletion()方法

已經渲染了頁面,在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。

注:一般使用preHandle這個攔截器進行預處理,對url進行請求攔截

 
 二、Spring Boot配置方式
1.自定義攔截器,需要繼承HandlerInterceptorAdapter類

@Component
public class AuthorityInterceptor extends HandlerInterceptorAdapter {
    private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class);
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("進入到攔截器中:preHandle() 方法");
        System.out.println(request.getServletPath());
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("進入到攔截器中:postHandle() 方法中");
        System.out.println(request.getRequestURI());
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("進入到攔截器中:afterCompletion() 方法中");
        System.out.println(request.getServletPath());
    }
}

2.注冊攔截器,需要繼承WebMvcConfigurerAdapter類

需要重寫addInterceptors方法,這里是對根目錄"/"進行攔截,可以指定攔截url請求目錄

 

@Configuration
public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private AuthorityInterceptor authorityInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
        //注冊自己的攔截器並設置攔截的請求路徑
        registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

3.測試結果

1)用戶請求的url如下所示:

2)發送請求,進入到攔截器

 

三、Spring 配置方式

注冊攔截器,使用spring mvc來注冊,替換上面的1.2步驟

<mvc:interceptors>
 <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="com.vivo.finance.web.interceptor.AuthorityInterceptor" />
 </mvc:interceptor>
  </mvc:interceptors>

四、對指定方法進行攔截或對某些方法不攔截
這里的注冊監聽器,自定義監聽器寫法和前面一致。

如果對url目錄下所有的請求進行了監聽,但需要對某些請求方法不進行攔截或單獨攔截,可以采用自定義注解方式,對方法加上自定義注解,攔截器進行掃描,對出現過自定義注解的方法進行單獨處理

1.自定義注解
目標為方法,僅在運行時有效LoginSuccess可以在定義中通過反射獲取字段值,僅用注解可以不管

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginVerify {
    boolean LoginSuccess() default true;
}

2.preHandle對自定義注解@LoginVerify進行攔截

preHandle對有@LoginVerify注解的方法進行單獨處理

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    logger.info("進入到攔截器中:preHandle() 方法");
    HandlerMethod handlerMethod=(HandlerMethod)handler;
    LoginVerify loginVerify=handlerMethod.getMethodAnnotation(LoginVerify.class);
    if (loginVerify!=null){
        System.out.println(loginVerify.LoginSuccess());
        logger.info("不需要對 @loginVerify注解方法 進行攔截");
    }else {
        logger.info("對非@loginVerify注解方法 進行攔截處理");
        System.out.println(request.getServletPath());
        System.out.println(request.getParameter("id"));
        return true;
    }
    return true;
}

3.自定義注解使用位置

將@LoginVerify注解施加到方法上即可

@LoginVerify(LoginSuccess=false)
@RequestMapping("/test2")
public String testConnection(){
    System.out.println("test2");
    return "test2";
}

4.實現結果

發送請求

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

版權聲明:本文為CSDN博主「蒼白的詠嘆調」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kuishao1314aa/article/details/109777304


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM