木心

毕竟几人真得鹿,不知终日梦为鱼

导航

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
    }







posted on 2019-04-18 11:16  wenbin_ouyang  阅读(6369)  评论(0编辑  收藏  举报