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

相關文章
相關標籤/搜索