最近在做前后端分离的项目,具体就是前端在登录成功时就把用户信息存在session中,前端在请求用户信息时,后端就提示请重新登录,因为设置了一个拦截器,每次请求都会判断session有没有用户信息,没有就提示重新登录。具体的原因就是ajax跨域请求,后端就以为是新的用户,就生成新的sessionId,因为getSession()是根据cookie中的sessionId来得到session,没有则创建新的session
前端解决方法
$.ajax({
type: requestMethod,
url: requestUrl,
data: requestData,
//写上withCredentials: true,就是永许携带cookie请求,ajax默认不携带cookie
xhrFields: {
withCredentials: true
},
dataType: "json",
success: function (response) {
map.set("success",response);
cb(map);
},
error: function(response){
map.set("error",response);
cb(map)
}
});
后端解决方法,建议在过滤器写上
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest rep = (HttpServletRequest) request;
//可以跨域的请求地址(前端设置withCredentials: true时,后端就需要指定跨域的地址)
resp.setHeader("Access-Control-Allow-Origin","http://127.0.0.1:5500");
//跨域请求的间隔时间 0:无间隔 3600:每个小时检查凭证
resp.setHeader("Access-Control-Max-Age","0");
//所有携带头部信息的都可以
resp.setHeader("Access-Control-Allow-Headers","*");
//可以携带凭证
resp.setHeader("Access-Control-Allow-Credentials", "true");
//所有方法都可以
resp.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS,"*");
//回应为json
resp.setHeader("Content-Type","application/json;charset=utf-8");
chain.doFilter(request,response);
}
这里有个小插曲,就是这里都写上了为什么还不行我遇到的情况是我在前端设置一个常量beasurl=http:127.0.0.1:8080/但就在出现问题的请求方法中我没有引用此Url,用了http:localhost:8080/,所以问题出现在地址不一致上