web拦截器


springboot请求拦截器

WebMvcConfigurer:拦截器的注册类
HandlerInterceptorAdapter:拦截组件

拦截组件HandlerInterceptorAdapter可以有多个,需要注册到WebMvcConfigurer里面,在WebMvcConfigurer里面拦截器是按顺序执行的。

一、实现HandlerInterceptor接口中的preHandle方法(返回false表示拦截,true放行,在请求前拦截)

public class AuthInterceptor implements HandlerInterceptor {
    /**
     * 通过配置是否认证,对开发环境免除校验,方便开发
     */
    @Value("${is.auth}")
    private boolean isAuth;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //添加条件判断
        if(handler instanceof HandlerMethod){
            //可以从handler 获取中获得方法
           // Method method = ((HandlerMethod) handler).getMethod();


            if(isAuth){
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request1 = requestAttributes.getRequest();

                String sign = request1.getHeader("sign");
                System.out.println("从HttpServletRequest直接获取"+sign);
                String sign1 = request1.getHeader("sign");
                System.out.println("从RequestContextHolder中获取的"+sign1);
                if ("123".equals(sign1)) {
                    System.out.println("校验通过");
                    return true;
                }
                System.out.println("校验不通过");
                return false;
            }
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

WebMvcConfigurer拦截器注册类

1、配置拦截器(这个里面添加了跨域支持,当集成swagger防止后台报错),如果没有必要删除其配置,这里做一下展示。

@Configuration//加载当前的拦截器进行注册
public class AdminCommonConfig implements WebMvcConfigurer {



    /**
     * 跨域支持
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                .maxAge(3600 * 24);
    }

    /**
     * 自定义拦截器地址
     * @return
     */
    @Bean
    public HandlerInterceptor authInterceptor(){
        return new AuthInterceptor();
    }

    /**
     * 添加拦截路径
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截的url地址
        String url = "/**";
        //添加排除排除URL校验路径
        List<String> patterns = new ArrayList<>();
        patterns.add("/css/**")
        patterns.add("/web/login.html")
        registry.addInterceptor(authInterceptor()).addPathPatterns(url).excludePathPatterns(patterns);
    }

    /**
     * 当集成swagger防止后台报错
     * No mapping found for HTTP request with URI [/swagger-resources/configuration/ui] in DispatcherServlet with name 'dispatcherServlet'
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //过滤swagger
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

文章作者: 艾茶叶蛋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 艾茶叶蛋 !
  目录