java spring 跨域

在過濾器里面添加頭就可以了,但是會碰到下面的問題:
. 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.
當前端請求有參數(shù):
withCredentials: true的時候會出現(xiàn)上述問題,因為瀏覽器的安全策略,當允許 credentials 的時候,Access-Control-Allow-Origin 值不能是*,而必須是一個指定的域名, 那么如何針對不同的訪問設(shè)定對應(yīng)的跨源允許域呢?

HTTP 中的Referer能很好地實現(xiàn)該需求,當在一個域下發(fā)起一個 CORS 請求時,HTTP 請求頭的 Referer 值會自動被設(shè)置為當前頁面域,此時只要在服務(wù)器端讀取 Referer 值,構(gòu)造出相應(yīng)的 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;
    // 防止流讀取一次后就沒有了, 所以需要將流繼續(xù)寫出去
    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];
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端程序使用ExtJS的寫,在本地測試,發(fā)送請求到服務(wù)器時,發(fā)現(xiàn)存在跨域的問題,餅干也沒有一套成功,于是乎在這里整...
    南濱月亮閱讀 1,580評論 0 1
  • CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 ...
    奇特思維家閱讀 1,176評論 0 3
  • CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 ...
    起名字太累閱讀 1,011評論 0 2
  • 一只喜歡獨居的斑馬 總會慢慢擎起燭 成為森林里的路燈 造物主是值得感激的 所以我不是斑馬 我想成為森林 只要有人認...
    缺耳閱讀 245評論 0 3
  • 看到自己的無能, 世界灰暗著, 但若不繼續(xù)向前走, 你就只能沉睡在黑暗里, 永遠見不到光, 無所謂多黑, 向前走吧...
    守望中的琦琦閱讀 118評論 0 0

友情鏈接更多精彩內(nèi)容