SpringBoot自定义拦截器和跨域配置冲突

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot自定义拦截器和跨域配置冲突相关的知识,希望对你有一定的参考价值。

参考技术A 在我们使用springboot中,难免遇到前后端分离的场景,因此也带来的问题是跨域请求,虽然springboot在配置跨域请求中非常方便,但是如果投跨域场景和自定义拦截器一起使用的话,那就没那么顺利了。二者功能会有冲突,究其原因是当有请求发送到后端时,先被自定义拦截器拦截,如果拦截器验证没有问题,才会开始执行跨域配置。

解决办法:

让跨域配置在自定义拦截器之前执行,由于 Filter 的执行顺序大于自定义拦截器,因此可以在 Filter 中实现跨域的配置

拦截器配置

详解Springboot中自定义SpringMVC配置

详解Springboot中自定义SpringMVC配置

WebMvcConfigurer接口

? 这个接口可以自定义拦截器,例如跨域设置、类型转化器等等。可以说此接口为开发者提前想到了很多拦截层面的需求,方便开发者自由选择使用。由于Spring5.0废弃了WebMvcConfigurerAdapter,所以WebMvcConfigurer继承了WebMvcConfigurerAdapter大部分内容。

WebMvcConfigurer接口中的方法

技术图片

举例1:configurePathMatch配置请求后缀是否包含.*来映射请求

@Configuration
public class WebMVCConfiguration implements WebMvcConfigurer {

    /**
     * 是否包含.*来映射请求
     * 假设RequestMapping注解中指定的路径是/test
     * 如果设置成True,那么对于/test.do,/test.a等任何包含.的请求都会映射到/test上去;
     * 如果设置成False,那么对于这种请求不会进行映射。
     *
     */
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(true);
    }


}

结果:

技术图片

举例2:configureHandlerExceptionResolvers配置全局异常处理器

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
            resolvers.add(new HandlerExceptionResolver() {
                @Override
                public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
                    BaseResult baseResult = new BaseResult();
                    if(e instanceof MissingServletRequestParameterException) {
                        baseResult.setCode(-1);
                        baseResult.setMessage("系统参数异常,请联系管理员");
                    }

                    httpServletResponse.setCharacterEncoding("UTF-8");
                    httpServletResponse.setHeader("Content-type", "application/json;charset=UTF-8");
                    try {
                        httpServletResponse.getWriter().write(JSON.toJSONString(baseResult));
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    return new ModelAndView();
                }
            });
    }

结果:

技术图片

以上是关于SpringBoot自定义拦截器和跨域配置冲突的主要内容,如果未能解决你的问题,请参考以下文章

详解Springboot中自定义SpringMVC配置

springboot如何解决跨域问题?

获取 API、自定义请求标头、CORS 和跨域重定向

Spring Security---跨域访问和跨站攻击问题详解

同源策略和跨域解决方案 CORS

同源策略和跨域解决方案 CORS