SpringBoot:拦截器开启跨域配置

什么是浏览器跨域和springboot怎么解决

  • 跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"

    协议相同  http https
    域名相同  www.xdclass.net
    端口相同  80  81
    
    一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
    
    浏览器控制台跨域提示:
    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
    
  • 解决方法

     1)JSONP	(现在使用较少)
     2)Http响应头配置允许跨域	(Nginx)
             nginx层配置 https://www.cnblogs.com/hawk-whu/p/6725699.html
     3)程序代码中处理 SpringBoot 通过拦截器配置
     
      //表示接受任意域名的请求,也可以指定域名
     response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
     
     //该字段可选,是个布尔值,表示是否可以携带cookie
     response.setHeader("Access-Control-Allow-Credentials", "true");
    
     //允许跨域的请求方法
     response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
     //请求头信息
     response.setHeader("Access-Control-Allow-Headers", "*");
     
        //判断前端简单请求 非简单请求(请求为json类型为非简单请求)
        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            return true;
        }

Step1:配置拦截器

/**
 * 跨域拦截器
 */
public class CorsInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //表示接受任意域名的请求,也可以指定域名
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));

        //该字段可选,是个布尔值,表示是否可以携带cookie
        response.setHeader("Access-Control-Allow-Credentials", "true");

        //允许跨域的请求方法
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        //请求头信息
        response.setHeader("Access-Control-Allow-Headers", "*");

        //判断前端简单请求 非简单请求(请求为json类型为非简单请求)
        //遇简放行
        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            return true;
        }
        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 {

    }
}

Step2:配置拦截路径

@Configuration
public class InterceptConfig implements WebMvcConfigurer {

    @Bean
    CorsInterceptor corsInterceptor(){
        return new CorsInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //拦截全部 跨域   需要放在最上面
        registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
    }
}

response的跨域请求头就获取到了
在这里插入图片描述

  • options请求,这个需要注意
  • 注意点: 假如接口报错,则跨域配置可能不生效(报错建议断点调试,排除异常错误)

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/111314557
今日推荐