springboot中配置拦截器

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

相关文章
相关标签/搜索