会话跟踪技术(二)Session

本文深入探讨了Session在Web开发中的作用,包括Session的含义、工作机制和实现原理。当客户端请求时,服务器根据sessionid在服务器端的缓存中查找或创建session。另外,介绍了设置会话失效的三种方式:通过web.xml配置、session-timeout元素以及setMaxInactiveInterval方法。了解这些,有助于更好地管理用户会话状态。
摘要由CSDN通过智能技术生成

Session机制

session含义
session在web开发环境中,指一类用来在客户端与服务器之间保持状态的解决方案,有时也指这种解决方案的存储结构
Session机制
Session机制采用的是在服务器端保持HTTP状态信息的方案(Cookie 客户端)
服务器使用一种散列表的结构来保存信息
当程序需要某个客户端的请求创建一个session时,服务器首先检查这个客户端请求里是否包含了一个session标识(sessionid),如果已经包含一个sessionid把这个session检索出来使用,如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session兑现,但用户认为地在请求的URL 后面附加一个JSESSION的参数。如果客户请求不包含sessionid,则谓词客户创建一个session并且生成一个与此session相关联的sessionid,这个sessionid将在本次响应中返回给客户端保存

session实现原理

session底层是依赖Cookie的
当首次使用session时,服务器端要创建session,session保存在服务器端缓存,而给客户端的是sessionid(一个cookie中保存了sessionid)客户端带走的是sessionid,而数据保存在session中
当客户端字词访问服务器是,在请求中会带上sessionid,而服务器会通过sessionid找到对应的session,而无需再创建新的session
在这里插入图片描述

例子

package com.org;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SessionIdServlet extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse resp)
	            throws ServletException,IOException{
	       resp.setContentType("text/html;charset=GBK");
	       PrintWriter out=resp.getWriter();
	       out.println("<html>");
	       out.println("<body>");
	       HttpSession session=req.getSession(true);
	       //先看session是否存在,存在就找到已有的session,不存在创建
	       String id=session.getId();
	       //拿到sessionid
	       out.println("SESSION ID:"+id);
	       //session.setAttribute("username","tom");
	       //out.println("<br>+<a herf=ShowSession>查看session</a>");
	       session.setAttribute("username", "kelly");//将用户名保存在Session范围
           out.println("<br>" + "<a href=" + "ShowSession" + ">查看session</a>");
	       out.println("</body>");
	       out.println("</html>");
	     
	       out.close();
	            }
	
     public void doPost(HttpServletRequest req,HttpServletResponse resp)
	            throws ServletException,IOException{
	       this.doGet(req,resp);
	            }	

}

package com.org;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowSession extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse resp)
	            throws ServletException,IOException{
	       resp.setContentType("text/html;charset=GBK");
	       PrintWriter out=resp.getWriter();
	       out.println("<html>");
	       out.println("<body>");
	       HttpSession session=req.getSession(true);
	       String name=(String)session.getAttribute("username");
	       out.println("username:"+name);
	       out.println(new Date(session.getCreationTime()));
	       out.println(new Date(session.getLastAccessedTime()));
	       out.println("</body>");
	       out.println("</html>");
	     
	       out.close();
	            }
	
     public void doPost(HttpServletRequest req,HttpServletResponse resp)
	            throws ServletException,IOException{
	       this.doGet(req,resp);
	 }
}	 	
SessionId com.org.SessionIdServlet SessionId /SessionId ShowSession com.org.ShowSession ShowSession /ShowSession ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200419103909734.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200419103933190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70)

设置会话失效的三种方式

session-timeout(web.xml)元素与session.setMaxInactiveInterval()函数

a) 在web服务器的配置文件中设置
在tomcat中的conf/server.xml文件可以修改服务器上的所有程序的默认有效期,设置单位为毫秒,定义代码如下:

b)在web.xml中的session-config配置
session-timeout元素(WEB.XML文件中的元素)用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。
如:

  1. 30

//30分钟

c)
setMaxInactiveInterval设置的是当前会话的失效时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。
在程序中手动设置,设置为-1则表示永不过期
java 代码:
session.setMaxInactiveInterval(30 * 60);//注意服务器端的30*60秒,而不是客户端的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值