项目需求:每一个请求中有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