攔截器的作用
将多個Cotroller中共有的代碼放在攔截器中執行,減少Controller中的代碼備援,最常用的登入攔截、或是權限校驗、或是防重複送出。
攔截器的特點
1)請求到達經過攔截器,響應回來經過攔截器
2)攔截器中斷使用者的請求軌迹
3)攔截器隻能攔截控制器相關請求路徑
springboot中攔截器開發步驟
1.自定義一個攔截器MyInterceptor實作HandlerInterceptor接口,不要忘記加上@Component注解建立元件
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//取出登陸标志位
Object user = request.getSession().getAttribute("user");
if(user == null){
//如果沒有登陸 就重定向到登入頁面 /shopcar是配置檔案中設定的context-path
response.sendRedirect("/shopcar/view/LoginView.jsp");
return false;
}else{
//登入過了就放行
return true;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
這其中有三個方法:
- preHandle:在業務處理器處理請求之前被調用。預處理,可以進行編碼、安全控制、權限校驗等處理;
- postHandle:在業務處理器處理請求執行完成後,生成視圖之前執行。後處理(調用了Service并傳回ModelAndView,但未進行頁面渲染),有機會修改ModelAndView (這個部落客就基本不怎麼用了);
- afterCompletion:在DispatcherServlet完全處理完請求後被調用,可用于清理資源等。傳回處理(已經渲染了頁面);
2.建立InterceptorConfig繼承WebMvcConfigurerAdapter類,覆寫其中的
addInterceptors方法,同樣不要忘了加@Component注解
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor getMyInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptor = registry.addInterceptor(getMyInterceptor());
// 攔截所有、排除
interceptor.addPathPatterns("/**")
.excludePathPatterns("/user/login");
}
}
這樣一個攔截器的強制登入就實作了。