关于Ajax异步请求的跨域以及Session问题

 根据浏览器的保护规则,跨域时候的SeeionId是不会被保存下来,即我们的每次Ajax请求都会是一个新的请求,都会产生新的SeesionId,后台自然不能根据前台传过来的SeesionId判断你是否处于登录状态。
 我们可以对前台的Ajax以及后台进行相应的修改,就可以对上述问题进行完美解决:

前端Ajax请求

$.ajax({    
url:url,
xhrFields: {
withCredentials: true // 加上此部分
},
crossDomain: true, // 加上此部分
success:function() {
},
error:function() {
}
});

Controller部分代码

@RequestMapping(value="XXXX.do")
@ResponseBody
public String XXXXX( HttpServletRequest request, HttpServletResponse response){
// 解决跨域
response.addHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
// 跨域的session 保证同一性
response.addHeader("Access-Control-Allow-Credentials","true");
///
somecode
///

PS: withCredentials:默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。
 如果服务器接收带凭据的请求,会用下面的HTTP头部来响应,Access-Control-Allow-Credentials: true。如果发送的是带凭据的请求,但服务器的相应中没有包含这个头部,那么浏览器就不会把相应内容交给Ajax(于是,responseText中将是空字符串,status的值为0,而且会调用onerror()事件处理程序)。
 支持withCredentials属性的浏览器有Firefox 3.5+、Safari 4+和Chrome。IE10及更早版本都不支持。

Author: HB
Link: http://www.huangbin.fun/关于Ajax异步请求的跨域以及Session问题.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.