服务器端会话技术——session
什么是一次会话呢,在生活中一次会话就是一次聊天,那么在J2EE中的一次会话指的是什么呢?
简单的说,打开浏览器,访问服务器,直到浏览器关闭,称为一次会话,严格的说,一次会话应该是依赖session的生成机制,那么什么是Session的生成机制呢?
Session生成机制:
首先服务器必须调用request.getSession(),如果请求中没有带sessionId的cookie,则服务器一定会创建一个新的Session对象,如果请求中带了sessionID则服务器会根据传入的SessionId找到对应的session对象,如果session对象已经失效了,则会创建新的session对象,如果没有失效则会使用找到的session对象
需要注意的是当浏览器关闭,重启浏览器时,seesionId还是存在请求中的,但是由于关闭浏览器已经使存在内存中的cookie失效了,所以sessionID只是丢失了,而并没有失效
设置Session的空闲时间
Session.setMaxInactiveInterval(10);
空闲时间也就是说在规定时间内如果有重新访问则时间重置,如果没有访问那么SessionID就会失效
使session对象强制失效:
Session.invalidate();
1、概念:
服务器端 会话技术,在一次会话的多次请求间共享数据,将数据 保存 在服务器端的对象中。HttpSession
2、快速入门:
HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeValue(String name)
@WebServlet(name = "SessionDemo1", urlPatterns = {"/SessionDemo1"})
public class SessionDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session共享数据
//1、获取session
HttpSession session = request.getSession();
//2、存储数据
session.setAttribute("name","李逸");
//3.1、转发方式
// request.getRequestDispatcher("/SessionDemo2").forward(request,response);
//3.2、重定向
response.sendRedirect("/day18/SessionDemo2");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet(name = "SessionDemo2", urlPatterns = {"/SessionDemo2"})
public class SessionDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session共享数据
//1、获取session
HttpSession session = request.getSession();
//2、获取数据
Object name = session.getAttribute("name");
System.out.println("SessionDemo2:"+name);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3、原理
session的实现是依赖于cookie的。
4、细节:
1、当客户端关闭后,服务器不关闭,两次获取的session是否是同一个?
答:默认情况下,不是。
如果需要相同,则可以创建cookie,键为JSSIONIN,设置最大存活时间,让cookie持久化保存。
@WebServlet(name = "SessionDemo3", urlPatterns = {"/SessionDemo3"})
public class SessionDemo3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println(session);
//期望客户端关闭后,session也可以相同
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2、客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
答:不是同一个,但是要确保数据不丢失。
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上。
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
3、session的失效时间?
1、服务器关闭
2、Session.invalidate();使session对象强制失效
3、session默认失效时间:30分钟
选择性的配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5、session的特点:
1、session用于存储一次会话的多次请求的数据,存在服务器端。
2、session可以存储任意类型,任意大小的数据。
session与cookie的区别:
1、session存储数据在服务器端,cookie在客户端。
2、session没有数据大小限制 ,cookie有。
3、session数据安全,cookie相对于不安全。