Spring攔截器&過濾器


一、攔截器 Interceptor

  實現HandlerInterceptor接口,並重寫以下方法

    preHandle(..):在實際處理程序運行之前

    postHandle(..): 處理程序運行后

      afterCompletion(..): 完成請求后

  preHandle方法返回一個布爾值,可以使用此方法中斷或繼續執行鏈的處理。當此方法返回true時,處理程序執行鏈繼續;當返回false時,DispatcherServlet 假定攔截器本身已經處理了請求(並且,例如,呈現了適當的視圖)並且不會繼續執行其他攔截器和執行鏈中的實際處理程序

 

  1、定義攔截器

public class MyInterceptor implements HandlerInterceptor {

    /**
     * controller執行前調用此方法
     * 返回true表示繼續執行,返回false中止執行
     * 這里可以加入登錄校驗、權限攔截等
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("interceptor preHandle");
        return true;
    }

    /**
     * controller執行后但未返回視圖前調用此方法
     * 這里可在返回用戶前對模型數據進行加工處理,比如這里加入公用信息以便頁面顯示(比如:菜單導航)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("interceptor postHandle");
        // TODO
    }

    /**
     * controller執行后但未返回視圖前調用此方法
     * 這里可在返回用戶前對模型數據進行加工處理,比如這里加入公用信息以便頁面顯示(比如:菜單導航)
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("interceptor afterCompletion");
        // TODO
    }
}

  2、注冊攔截器

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

    xml配置方式:

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

 

  

 

二、過濾器 Filter

  過濾器能起到攔截請求並做出相應動作。比如可以進行登錄過濾等

  實現方式:實現Filter接口、實現AbstractFilter抽象類

  1、定義過濾器(實現Filter接口)

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(filterName = "myFilter", urlPatterns = "/*", initParams = {
        @WebInitParam(name = "name", value = "yang")})
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter init");
        String name = filterConfig.getInitParameter("name");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("filter doFilter");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("filter destroy");
    }
}

  2、注冊Filter

    有以下兩種方式:

      ①:在Filter上添加@Component注解

      ②:Spring啟動類上添加 @ServletComponentScan注解

 

 

 

三、Interceptor、Filter、Aop執行順序  

filter init
filter doFilter
interceptor preHandle
aop start
hello controller
aop end
interceptor postHandle
interceptor afterCompletion

 

 

 

 

 

 

END.


免責聲明!

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



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