項目需求:每一個請求中有token,須要在攔截器中經過token獲取到userId。java
/** * 註冊攔截器 * * @author * @date 2018-05-14 08:50 */ @EnableWebMvc @Configuration public class MyWebAppConfig extends WebMvcConfigurerAdapter { @Bean InterceptorConfig InterceptorConfig() { return new InterceptorConfig(); } @Override public void addInterceptors(InterceptorRegistry registry) { //註冊自定義攔截器,添加攔截路徑和排除攔截路徑 registry.addInterceptor(InterceptorConfig()).addPathPatterns("/score_mall/**"); super.addInterceptors(registry); } }
/** * @author * @date 2018-05-14 08:55 */ @Component public class InterceptorConfig implements HandlerInterceptor { private static Logger logger = LoggerFactory.getLogger(InterceptorConfig.class); @Autowired private IUserService userService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { Object reqToken = httpServletRequest.getParameter("token"); if (null == reqToken) { logger.warn("Request no token [400]."); try { httpServletResponse.sendError(HttpStatus.BAD_REQUEST.value(), "request no token"); } catch (IOException e) { logger.error("", e); } return false; } String token = (String) reqToken; if (StringUtils.isEmpty(token)) { logger.warn("Request token expire [400]."); try { httpServletResponse.sendError(HttpStatus.BAD_REQUEST.value(), "token invalid"); } catch (IOException e) { logger.error("", e); } return false; } logger.info("Request token: {}.", token); // 獲取userId final String userId = userService.getUserIdByToken(token); if (StringUtils.isEmpty(userId)) { logger.warn("Request token cannot get userId [400]."); try { httpServletResponse.sendError(HttpStatus.BAD_REQUEST.value(), "token invalid"); } catch (IOException e) { logger.error("", e); } return false; } logger.info("UserId: {}.", userId); logger.info(">>>>>>>>>>攔截器執行完畢."); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { //logger.info(">>>postHandle>>>>>>>請求處理以後進行調用,可是在視圖被渲染以前(Controller方法調用以後)"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { //logger.info(">>>afterCompletion>>>>>>>在整個請求結束以後被調用,也就是在DispatcherServlet 渲染了對應的視圖以後執行(主要是用於進行資源清理工做)"); } }
參考了https://stackoverflow.com/questions/23349180/java-config-for-spring-interceptor-where-interceptor-is-using-autowired-spring-b,中解決攔截器中沒法注入spring bean的問題。spring