JavaWeb-Session详解

1.概念

session时服务器会话技术,在一次会话的多次请求间共享数据,将数据保存在服务端的对象HttpSession中,是一个域对象

2.使用

HttpSession接口中有几个方法:

  • void setAttribute(String var1, Object var2);
  • Object getAttribute(String var1);
  • void removeAttribute(String var1);

以下是使用的具体过程:
JavaWeb-Session详解_第1张图片
输出结果为hello session
在这里提一下req.getSession()
HttpSession为一个接口,且没有任何实现类,获取session是通过request获取
来看一下request内的方法

HttpSession getSession();

是一个空实现,我们再来打印一下session:

org.apache.catalina.session.StandardSessionFacade@17e49b93

结果发现session对象的创建与request和response一样,是由tomcat内部创建
在这里列出getSession()的用法:

  • 有参:true或false

    • true:HttpServletRequest.getSession(ture) :参数为true时,若存在会话,则返回该会话,否则新建一个会话
    • false:参数为false时,如存在会话,则返回该会话,否则返回NULL
  • 无参:HttpServletRequest.getSession()和 HttpServletRequest.getSession(ture) 是一个意思

3.原理分析

在第一次获取session时,是没有cookie的,服务器在内存中新建一个session对象,这个对象有唯一一个ID,随后做出响应,发送一个cookie,客户端接收到cookie后保存,在下一次访问服务器时,通过请求头cookie:JSESSIONID=4B449EFE4EBD4251225BDABFBE6BD78F将session的id发送给服务器,服务器会自动识别id,查看内存中是否有和id符合的session对象
JavaWeb-Session详解_第2张图片
我们通过抓包来验证:
JavaWeb-Session详解_第3张图片
显示并没有错误,从而我们可以得出结论:
session是依赖于cookie的,也进而证明了两次请求中的session是同一个对象

4.细节

1.客户端关闭,服务端未关闭,默认情况下两次获取的session对象不是同一个,客户端关闭,代表一次会话结束,再次获取就没有cookie头了
解决办法:

		HttpSession session = req.getSession();
        Cookie c = new Cookie("JESSIONID",session.getId());
        c.setMaxAge(60*60);
        resp.addCookie(c);

2.客户端不关闭,服务器关闭,两次获得的session不是同一个,但是要确保数据不丢失,解决:

  • session钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
  • session活化:在服务器启动后,将session文件转化为内存中的session对象

tomcat已经将上述解决办法实现了,注意是使用本地tomcat,idea上的tomcat只会
完成钝化过程,并不会完成活化过程

3.session销毁

  • 服务器关闭
  • session对象调用invalidate()
  • session默认失效时间30分钟

可以在tomcat的conf文件夹找到web.xml
JavaWeb-Session详解_第4张图片
自定义编辑即可

4.session特点:

  • session用于存储一次会话的多次请求的数据,存在服务器端(重定向可以使用)
  • session可以存储任意类型,任意大小的数据

你可能感兴趣的:(JavaWeb-Session详解)