首先我们应了解session是什么?
Session是一个作用域,是存放客户端一些简单的重要信息,当一台服务器运行时,可能有很多用户通过浏览器访问这台服务器,默认情况当用户第一次访问这台服务器时,服务器会为这个用户分配一个session(存放于服务端),同时会为用户的提供唯一JSESSIONID,存放于cookie中,浏览器会自动将用户的此cookie自动附加在HTTP请求头信息中。
这唯一的SessionID是很有用的,我们可以想象一下,假使同时有很多用户访问同一个服务器,那服务器是如何区分这些用户来响应这些用户呢。就是通过请求头信息中SessionID进行区分而响应不同的用户。
一、Session创建与销毁
1.隐式session创建
默认情况下, 第一次访问一个 WEB 应用的一个 JSP 页面时, 该页面都必须有一个和这个请求相关联的 Session 对象(服务器分配的). 因为 page 指定的 session 属性默认为 true (<%@ page language=”java” contentType=”text/html; charset=UTF-8” pageEncoding=”UTF-8” session=”true”%>),jsp在编译转换的过程中会自动生成session;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
因JSP文件在编译成Servlet时将会自动加上这样一条语句 session = pageContext.getSession( );这也是JSP中隐含的session对象的来历。
2.<%@ page session=’false’ %>的内涵
若<%@ page session=’false’ %> 指定的 session 设置为 false时 , JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以若第一次访问当前 WEB 应用的 JSP 页面时,服务器 就不会创建一个 Session 对象.
3.显示创建一个 Session 对象:
若 <%@ page session=’false’ %> 指定的 session 设置为 false 时,可在 Servlet 中可以通过以下API 获取 Session 对象. request.getSession(flag):
若 flag 为 true, 则一定会返回一个 HttpSession 对象,
若flag 为false: 若有关联的, 则返回此HttpSession 对象; 若没有, 则返回 null ;
request.getSession(): 相当于 request.getSession(true);
4. Session 对象的销毁:
①. 直接调用 HttpSession 的的 invalidate()对象
②. HttpSession 超过过期时间.
返回最大时效: getMaxInactiveInterval() 单位是秒
设置最大时效: setMaxInactiveInterval(int interval)
可以在 web.xml 文件中配置 Session 的最大时效, 单位是分钟.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
③. 卸载当前 WEB 应用. 注意: 关闭浏览器不会销毁 Session!
二、保存session id的方式
1.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按规则把这个标识发送给服务器。
2.由于cookie可以被人为的禁用,必须有其他机制以便在cookie被禁用时仍然能够把session id 传递回服务器,经常采用的一种技术叫做URL重写,就是把sessionid附加在URL路径后面。
附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。
网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id.
HttpServletResponse接口中定义了两个用于完成URL重写方法:
encodeURL方法
encodeRedirectURL方法
如果在浏览器不支持Cookie或关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现现有状态的会话,就必须对所有可能被客户端访问的请求路径进行URL重写。
<form action="<%= response.encodeURL("hello.jsp")%>" method="post">
username:<input type="text" name="username"
value="<%= username%>"/>
<input type="submit" value="Submit"/>
</form>
Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话,这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。
三、HttpSession的相关API
1.获取Session对象:request.getSession()、request.getSession(boolean create)
2.属性相关的:setAttribute,getAttribute、removeAttribute
3.使HttpSession失效:invalidate()方法
4.设置最大有效期:setMaxInactiveInterval