前幾天作了一個項目, 先後端分離, 後端只提供接口, 遇到第一個問題,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 預檢直接返回,後面正常請求就能成功處理了。後端