跨域ajax請求 cookie存儲

前幾天作了一個項目, 先後端分離, 後端只提供接口, 遇到第一個問題,ajax請求是跨域的, 又須要登陸, 準備使用原生的tomcat session 登陸後記錄到session裏就行了。
第一個問題:ajax請求寫回的cookie,不能直接寫到瀏覽器裏,每次登陸都會失效,解決方案是服務器端返回頭加上
response.setHeader("Access-Control-Allow-Origin", 發起請求的域名例如:http://baidu.com 必定要全域名);
    response.addHeader("Access-Control-Allow-Credentials", "true");
    response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    response.addHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");

ajax請求時也須要加參數:ajax

$.ajax({
                  type: "get",
                  url: "url",
                  dataType: 'text',
                  xhrFields: {
                      withCredentials: true
                  },
                  crossDomain: true,
                  success: function(data){
                      console.log(data);
                  }
              }
      );

這樣解決了, 跨域cookie傳遞問題, 後來就出現了一個問題, PUT , DELETE 方法請求時出現問題, 看到後臺日誌很明顯是用OPTION 方法請求, 後來查了資料才知道, 這叫OPTION預檢, 預檢的時候沒有在springmvc裏找到對應的方法, 直接報錯, 最後加上過濾器spring

logger.info("http method:{}", httpServletRequest.getMethod());
    if (httpServletRequest.getHeader("Access-Control-Request-Method") != null
            && StringUtils.equalsIgnoreCase("OPTIONS", httpServletRequest.getMethod()) ) {
            // CORS "pre-flight" request
            httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            httpServletResponse.addHeader("Access-Control-Allow-Headers", "Content-Type");
            httpServletResponse.addHeader("Access-Control-Max-Age", "1800");//30 min


            return;
        }
        filterChain.doFilter(httpServletRequest, httpServletResponse);

OPTION 預檢直接返回,後面正常請求就能成功處理了。後端

相關文章
相關標籤/搜索