ajax跨域問題解決sessionid不一致問題


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
    }








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM