背景
session和cookie作为会话管理的实现方案,对此做较为深入的学习,本文是以java为例。
session会话
1. session的会话的过程
- 客户端向服务端发起第一个请求(访问jsp或者sevlet)
- 服务端获取客户端传递过来的cookie,找到一个key=JSESSIONID的cookie
- 如果没有该cookie则服务端创建一个新的cookie返回给客户端
- 客户端下次访问的时候自动携带该cookie给服务器
2. 会话创建过程的相关说明
-
客户端发起第一个请求(访问jsp或者servlet)不一定会创建session
-
默认情况下访问jsp页面会创建一个session,因为session默认等于true
-
如果session=false,则希望通过request.getSession来创建session
- request.getSession(false),则不会创建一个session,但是会获取之前已经传教的session,若之前也没有创建则,这返回null
- request.getSession(true),会获取之前已经传教的session,若之前也没有创建则,这新建一个session返回。
-
-
JSESSIONID
服务端创建的名为JSESSIONID的cookie和其他的cookie不太一样。服务端创建的名为JSESSIONID的cookie保存在浏览器的内存中,默认的过期时间是30分钟,关闭浏览器或者对应的标签页后,session就找不到了。可以通过在服务器端设置持久化到硬盘上(这其实是通过cookie的持久化技术,防止关闭浏览器后session失效的解法)。
Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(20); response.addCookie(cookie);
-
jsp的相关指令说明
jsp中session=“false”之后不能使用jsp隐含的session对象。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="ISO-8859-1" session="false" %>
例如:
虽然不能使用隐含的session对象,但是可以通过request.getSession获得。
<% HttpSession session = request.getSession(true); out.println(session); %>
若session=true,则不同通过显示的方式生成session
3. session相关API
getId
getCreationTime
getLastAccessedTime
setMaxInactiveInterval
getMaxInactiveInterval
isNew 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。
invalidate // 失效
getServletContext
setAttribute // 设置属性
getAttribute
removeAttribute
getAttributeNames