SpringBoot拦截器使用

1,034 阅读1分钟

拦截器配置类

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    //注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(myInterceptor);//注册拦截前端所有请求
        interceptorRegistration.addPathPatterns("/**");//拦截前端所有请求
        interceptorRegistration.excludePathPatterns("/user/login");//不拦截前端的请求
    }

}

拦截器类

/**
 * 拦截器类
 */
@Component
public class MyInterceptor implements HandlerInterceptor {

    //日志
    private static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

    //单点服务url
    @Value("${token.tokenUrl}")
    private String url;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        try {
            logger.info("************************************进入拦截器**********************************");
            //从前端请求中获取token 权限id 节点id
            String token = request.getHeader("Authorization");
            String needPermission = request.getHeader("needPermission");
            logger.info("拦截器获取token ===== " + token);
            //如果是用户身份是游客,则不需要登录 直接放行
            if (StringUtils.isNotEmpty(needPermission)) {
                if (!Boolean.valueOf(needPermission)) {
                    return true;
                }
            }
            //如果没有Token为空,拦截
            if (StringUtils.isEmpty(token)) {
                logger.info("no token");
                //给前端返回信息,由前端控制路由跳转,就不用后端做重定向到登录页
                AjaxResult ajaxResult = new AjaxResult();
                ajaxResult.put("code",CodeStatus.noAuthorization);
                ajaxResult.put("msg","no token");
                response.getOutputStream().write(JSONObject.toJSONString(ajaxResult).getBytes("utf-8"));
                response.getOutputStream().flush();
                return false;
            }
            request.setAttribute("userIdByToken", token);
            //设置header
            HttpClientUtil.setToken(token);
            HttpClientUtil.setNeedPermission(needPermission);
            //去单点登录服务验证token
            String doPostWithHeader = HttpClientUtil.doPostWithHeader(1, url, "");
            logger.debug("doPostWithHeader : " + doPostWithHeader);
            //单点登录服务返回的内容
            AjaxResult parseObject = JSONObject.parseObject(doPostWithHeader, AjaxResult.class);
            int code = (int) parseObject.get("code");
            if (CodeStatus.tokenCorrect == code) {//正确
                logger.info("token check right and not timeout");
                return true;
            } else {
                response.getOutputStream().write(JSONObject.toJSONString(parseObject).getBytes("utf-8"));
                response.getOutputStream().flush();
                return false;
            }
        } catch (Exception e) {
            logger.error("exception : ", e);
            response.getOutputStream().write(JSONObject.toJSONString(e).getBytes("utf-8"));
            response.getOutputStream().flush();
            return false;
        }
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle执行了。。。。。。。");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion执行了。。。。。。。");
    }


}

Controller类

@RestController
public class EmptyController {

    //这个接口是为了让用户进拦截器,去得到单点登录服务返回的不同的code值
    @GetMapping("/goToInterceptor")
    public AjaxResult A(){
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.put("code",0);
        ajaxResult.put("msg","token check right and not timeout");
        return ajaxResult;
    }

}

启动类

/**
 * 启动程序
 *
 */
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableScheduling
@MapperScan("cn.com.taiji.*.mapper")
@ComponentScan({"cn.com.taiji.*.*"})
public class TaiPortalApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaiPortalApplication.class, args);
        System.out.println("===================启动成功======================");
    }
    
}