1、java的web項目中由於前后台分離導致每次請求springmvc的session都不一樣,所以無法在session中保存數據(https://blog.csdn.net/qq_41117519/article/details/79667885?utm_source=blogxgwz6)
解決方法:
ajax 跨域請求前台處理,紅色字段為ajax處理跨域屬性
$.ajax({ url:"http://citygame1234.4kb.cn/CityServer/w/login", type:"post", async:"false", dataType:"json", crossDomain: true, xhrFields: { withCredentials: true }, success:function(data){ console.log(data); } });
ajax 跨域請求 java后台filter處理
public class MyFilter implements Filter{ @Override public void destroy() {} @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) arg1; response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Origin, Accept, x-auth-token,Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException {} }
2、解決跨域,session不一致問題(原文:https://blog.csdn.net/qq_27373459/article/details/77099207)
今天前后交互 的時候發現session的id不一致。(我的邏輯是這樣的,用戶登錄,賬號密碼都正確的時候,我就把用戶信息放到session里面去,后續各種操作例如:獲取用戶信息等等。就不需要傳遞uid了。)
我這邊后台服務器啟動,前端進行接口對接的時候,后台一直獲取不到值。最后發現request里有值,session也有值,但是session的id卻不一致。想來想去不知道怎么回事。后來無意間想到跨域,以前解決過跨域問題,就是在fitter里加上
response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, Access-Token");
第一行,意思是運行從所有地址發來的請求。
第二行,意思是允許 POST, GET, OPTIONS, DELETE,這些方式的請求
第三行,意思是在該響應在多少秒內有效
第四行,意思是允許的請求頭類型
可是對於今天的問題還是報錯了。
那么從新來設置
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "0"); response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token,Access-Control-Allow-Headers"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("XDomainRequestAllowed","1");
注意:
Access-Control-Allow-Credentials 是true的時候。 Access-Control-Allow-Origin"的值不能為*。
在ajax 請求是也要加相應的東西
$.ajax({ url:url, //加上這句話 xhrFields: { withCredentials: true }, crossDomain: true, success:function(result){ alert("test"); }, error:function(){} });
這樣我們再跨域測試的時候,就會發現我們的sessionId是一樣的了,這樣就實現了跨域並且保證在同一個session下。
3、springboot完美跨域 解決sessionId不一致問題(https://blog.csdn.net/weixin_40461281/article/details/81196932)
增加mvc配置
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { System.out.println("我是MyWebConfig跨域"); //設置允許跨域的路徑 registry.addMapping("/**") //設置允許跨域請求的域名 .allowedOrigins("*") //是否允許證書 不再默認開啟 .allowCredentials(true) //設置允許的方法 .allowedMethods("*") //跨域允許時間 .maxAge(3600); } }
vue需要再main.js的import下增加以下代碼
axios.defaults.withCredentials = true
jquery需要再每次使用ajax時增加如下配置
xhrFields:{
withCredentials:true
}