大家可能遇到过,做登录时需要使用session来维护用户与服务器之前的关系,可能好多小伙伴不是很清楚session维护的原理,我简单讲一下session的原理,tomcat中session和cookie有着很密切的关联如下图

Session服务重启 服务器session失效_跨域

简单理解就是客户端和服务器之间传递着一个sessionID,来维护用户的会话状态,服务器端session生命周期为30min,客户端cookie生命周期也为30min,但是当浏览器关闭时客户端cookie也会随之消失,服务器端session不会消失,只能等待30分钟之后,或者调用session.invalidate();可以销毁session。(另外提醒可以使用firefox的firebug可以查看网络cookie)

      上述情况是同域时的情况,那么下面就是关于跨域请求的问题了,首先理解一下什么情况下是跨域,跨域、跨协议和跨端口都是跨域,我之前没注意到跨端口也是跨域。那么回到ajax这个问题上,ajax跨域有方式包括JSONP和CORS(跨域资源共享),我们知道ajax实现的核心是XMLHttpRequest接口,在XHR1中是不支持跨域(同域限制)的,但是XHR2中增加了对CORS的支持,使其能够支持跨域,不过CORS默认是不携带cookie的。CORS是一种需要服务器和前端配合的跨域技术,首先服务器必须允许跨域请求,另外客户端也需要添加响应的字段才可以携带cookie。我是用的是jquery的的ajax,我们看看前端配置

$.ajax({
      type:"POST",
      url:url,
      data:{data,data},
      dataType:"json",
      xhrFields: {withCredentials: true},     //与服务器配合使用标识允许携带cookie
      success:function(data){

      },
      error:function(XMLHttpRequest){

      },
    });

服务器端我添加了CORSFilter.java

package com.chenhai.educationsystem.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CrossFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response=(HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest)req;
        
        response.setHeader("Access-Control-Allow-Credentials", "true");  //支持跨域访问,跨域访问中cookie是默认忽略的,需要配合前端xhr的Credentials属性使用,该属性为true标识允许携带cookie
        //response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));  //控制那些源可以访问如:a.com
        response.setHeader("Access-Control-Allow-Headers", "content-type,authorization,x-requested-with");  //响应首部 Access-Control-Allow-Headers 用于 preflight request (预检请求)中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息。
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS"); //响应首部 Access-Control-Allow-Methods 在对 preflight request.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。
        filterChain.doFilter(req, res);
    }

    @Override
    public void destroy() {

    }
}

此处我列出一些相关网站

ajax跨域,cookie,session失效的问题解决办法

XMLHttpRequest

Access-Control-Allow-Headers

I want to add CORS support to my server

跨域资源共享 CORS 详解