美文网首页
java spring 跨域

java spring 跨域

作者: 把爱放下会走更远 | 来源:发表于2017-12-22 17:02 被阅读46次

在过滤器里面添加头就可以了,但是会碰到下面的问题:
. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.
当前端请求有参数:
withCredentials: true的时候会出现上述问题,因为浏览器的安全策略,当允许 credentials 的时候,Access-Control-Allow-Origin 值不能是*,而必须是一个指定的域名, 那么如何针对不同的访问设定对应的跨源允许域呢?

HTTP 中的Referer能很好地实现该需求,当在一个域下发起一个 CORS 请求时,HTTP 请求头的 Referer 值会自动被设置为当前页面域,此时只要在服务器端读取 Referer 值,构造出相应的 Access-Control-Allow-Origin 值即可,参考下面代码

 public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    String referer = req.getHeader("referer");
    HttpServletResponse res = (HttpServletResponse) response;
    if (!StringUtils.isEmpty(referer)) {
      try {
        res.setHeader("Access-Control-Allow-Origin", getHost(referer));
      } catch (Exception e) {
        log.error(e.getMessage(), e);
        res.setHeader("Access-Control-Allow-Origin", "*");
      }
    } else {
      res.setHeader("Access-Control-Allow-Origin", "*");
    }
    res.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
    res.setHeader("Access-Control-Max-Age", "3600");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type, token, nonce, signature, uid");

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    // 防止流读取一次后就没有了, 所以需要将流继续写出去
    ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(httpServletRequest);
    chain.doFilter(requestWrapper, response);
  }

  private String getHost(String referer) {
    String split = "/";
    String[] ss = referer.split(split);
    return ss[0] + split + ss[1] + split + ss[2];
  }

相关文章

  • 响应头设置跨域和Spring注解跨域

    CORS跨域原理详解Spring解决跨域 响应头设置跨域 Spring注解跨域@CrossOrigin 可添加到方...

  • 2018-12-11

    spring security 的跨域问题 spring security跨域设置 在spring-sercuri...

  • java spring 跨域

    在过滤器里面添加头就可以了,但是会碰到下面的问题:. A wildcard '*' cannot be used ...

  • 跨域配置

    SpringBoot跨域配置 我们的后端使用Spring Boot。Spring Boot跨域非常简单,只需书写以...

  • 浏览器跨域的那些事

    整理中 目标: 了解跨域 解决跨域 服务器配置跨域(java, nginx) 前端调试时配置解决跨域 一、什么是跨...

  • 2019-04-01

    Spring Boot轻松跨域:Spring Boot中采用注解轻松实现跨域的一个基础例子 1.项目结构,conf...

  • Java跨域问题以及如何使用Cors解决前后端 分离部署项目所遇

    Java跨域问题以及如何使用Cors解决前后端 分离部署项目所遇到的跨域问题 什么是跨域 跨域,指的是浏览器不能执...

  • 服务器端

    跨域问题的解决 重点就是java端的RESTful API 加上CrossOrigin,允许跨域。

  • SpringBoot+Vue数据交互

    后端框架Spring Boot,前端框架vue 1. 跨域+携带cookie 跨域-携带cookie 2. 拦截器...

  • 跨域访问

    参考文献:jsonp解决跨域问题 . cors解决跨域问题 . (java+前端小白)第一次碰到跨域问题,小伙伴们...

网友评论

      本文标题:java spring 跨域

      本文链接:https://www.haomeiwen.com/subject/qslxgxtx.html