一、攔截器 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.