package com.inongfeng.shop.admin.interceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebAppConfig extends WebMvcConfigurerAdapter{ @Bean public UserSecurityInterceptor userSecurityInterceptor(){ return new UserSecurityInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userSecurityInterceptor()).addPathPatterns("/**").excludePathPatterns("/Login"); super.addInterceptors(registry); } }
preHandle:預處理回調方法,實現處理器的預處理(如登陸檢查),第三個參數爲響應的處理器 返回值: true表示繼續流程(如調用下一個攔截器或處理器); false表示流程中斷(如登陸檢查失敗),不會繼續調用其餘的攔截器或處理器,此時咱們須要經過response來產生響應;java
postHandle:後處理回調方法,實現處理器的後處理(但在渲染視圖以前),此時咱們能夠經過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能爲null。web
afterCompletion:整個請求處理完畢回調方法,即在視圖渲染完畢時回調,如性能監控中咱們能夠在此記錄結束時間並輸出消耗時間,還能夠進行一些資源清理,相似於try-catch-finally中的finally,但僅調用處理器執行鏈中preHandle返回true的攔截器的afterCompletion。spring
在這裏咱們只需實現preHandle方法便可實現簡單攔截。session
package com.inongfeng.shop.admin.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.inongfeng.shop.admin.common.dt.Constants; import com.inongfeng.shop.admin.excepttion.LoginAuthException; @Component public class UserSecurityInterceptor implements HandlerInterceptor{ protected Logger logger = LoggerFactory.getLogger(getClass()); @Override public void afterCompletion(HttpServletRequest req,HttpServletResponse resp, Object arg2, Exception arg3)throws Exception { } @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception { HttpSession session = request.getSession(); if(StringUtils.isEmpty(session.getAttribute(Constants.SessionUserInfo))){ throw new LoginAuthException(Constants.E_LoginError_OR_TimeOut); } return true; } } }
上一步咱們拋出了登陸異常,可是還須要有地方去捕獲這個異常。如下代碼是一個全局捕獲並處理異常的類。 若是捕獲的是一個登陸異常,則返回讓用戶登陸。ide
package com.inongfeng.shop.admin.excepttion; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import com.inongfeng.shop.admin.common.dt.Constants; @ControllerAdvice public class GlobalExceptionHandler { protected Logger logger = LoggerFactory.getLogger(getClass()); @ExceptionHandler(value = BaseException.class) public Object baseErrorHandler(HttpServletRequest req, Exception e) throws Exception { if(e.getMessage().equals(Constants.E_LoginError_OR_TimeOut)){ if(logger.isDebugEnabled()){ e.printStackTrace(); logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {} ,登陸失敗或超時", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return "login"; }else{ logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return e.getMessage(); } @ExceptionHandler(value = Exception.class) public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { if(logger.isDebugEnabled()){ logger.error("---DefaultException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return e.getMessage(); } }