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