session机制
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。
我们通过一个例子来理解下:
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<%=session.getId()%>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
浏览器输入http://localhost:8080/day01/session.jsp
浏览器输出结果:4D52C99E52284589F15AB1C4E3C6E8CB
我们捕获下请求头、请求体
看第一次访问的请求标头,是没有携带cookie的
看第一次访问的相应标头,包含了一个Set-Cookie(name为JSESSIONID)
看第二次访问的请求标头,是携带Cookie的(name为JSESSIONID)
看第二次访问的相应标头:
持久化session-cookie
Session cookie 系统会创造一个名为JsessionId输出cookie,这就是通常说的session cookie,
我们知道在浏览器设置不禁用cookie,cookie不持久化的情况下,退出浏览器cookie消失,
因为默认情况下,cookie是一个会话级别的cookie,存储在浏览器的内核中,用户退出浏览器后被删除,若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,单位为秒
那么session会有什么不同嘛?我么做一个例子来理解下
session.jsp持久化时间为90秒
<body>
<%
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(90);
response.addCookie(cookie);
%>
</body>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
看第一次访问的请求标头,是没有携带cookie的
看第一次访问的相应标头,包含了一个Set-Cookie(name为JSESSIONID)
关闭浏览器,在90秒内,完成第二次访问!!!!
看第二次访问的请求标头,是携带Cookie的(name为JSESSIONID)
看第二次访问的相应标头:
这个例子就简单说明了下session的持久化,关掉浏览器重新打开输入网页,一样可以得到同一个session,并不是关闭了浏览器就销毁了session
session=”false”属性,不创建session的情况
1.若当前jsp是客户端访问当前web应用的第一个资源,且jsp的page指定的session属性值为false,则服务器就不会为jsp创建一个session对象
session.jsp 设置为session=”false”
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!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>
<%=request.getSession(false)%>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
对于Servlet而言
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是,如果servlet是客户端访问的第一个web应用资源,则只有调用了request.getSession()或者request.getSession(true)才会创建session对像,request.getSession(false)如果没有和当前页面关联的session对象也返回null,有则返回true,一句话无session对象返回null,有则true,request.getSession(true)如果没有关联的返回一个新创建的session,如有直接返回关联的session
在这种情况下,浏览器输出为null
2.若当前jsp不是客户端访问当前web应用的第一个资源,而其他页面已经创建了一个session,则当前页面会返回一个跟当前会话关联的session对象,而不会为当前jsp页面新建session对象的(比如超链接带过来的)
我们写2个简单的jsp
toSession.jsp只有一个超链接,跳转到session.jsp
<a href="session.jsp">tosession.jsp</a>
- 1
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!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>
<%=request.getSession(false)%>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
以下是截图:
在session.jsp中,也可以获取到toSession.jsp带来的session
toSession.jsp和session.jsp是同用了一个session
则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历,但如果页面显示的设置Session=false;是当前页面禁用session隐含的变量,但可以显示的定义其他session变量
request.getSession(true)显示创建session、以及Session的销毁,
1.Session.invalidate();
超出session的过期时间
2.session.setMaxInactiveInterval(); 单位为妙
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 1
- 2
- 3
3.卸载web应用
我们通过一个例子看下如何销毁session
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!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>
<%
//创建一个session对象
HttpSession session = request.getSession(true);
out.print(session.getId());
out.print("<br>");
out.print(session.getMaxInactiveInterval());
session.setMaxInactiveInterval(5);
out.print("<br>");
out.print(session.getMaxInactiveInterval());
%>
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
session默认是半小时-1800秒(这种通过request.getSession(true);创建的session)
5秒之后在请求,可以看出session值变化了,重建session