Session

1.HttpSession

1 )HttpSession:在服务器端保持HTTP状态信息的方案。和其对应的是Cookie

2  )产生HttpSession对象的过程:当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求是否包含了一个session标识((即sessionId),如果

已经包含了一个sessionId则说明以前已经为此客户端创建过session,服务器就按照session id 把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能

出现在服务端已经删除了该用户对应的session对象,但用户人为地请求的URL后面附加上一个JSESSION的参数)。如果客户端请求不包含sessionId,则为此客户端创建一个

session并且生成一个与此session相关联的sessionId,这个session id 将在本次响应中返回给客户端保存。

3 )使用Cookie 来跟踪Session:session通过SessionId来区分不同的客户,session是以cookie或URL重写为基础,默认使用cookie来实现,系统会创建一个名为JSESSIONID的输出cookie,这称之为session cookie,session cookie 是存储在浏览器内存中的,并不是写在硬盘上的,通常看不到JSESSIONID。

<%@ 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>

浏览器第一次访问服务器,服务器会在响应头添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,要求客户端设置cookie,如下图:

接下来,浏览器第二次、第三次...访问服务器,观察其请求头的cookie信息,可以看到JSESSIONID信息存储在cookie里,发送给服务器;且响应头里没有Set-Cookie信息

要浏览器未关闭,在访问同一个站点的时候,其请求头Cookie中的JSESSIONID都是同一个值,被服务器认为是同一个会话



2.HttpSession 的生命周期:

1). 什么时候创建 HttpSession 对象

①. 对于 JSP: 是否浏览器访问服务端的任何一个 JSP, 服务器都会立即创建一个 HttpSession 对象呢?
不一定。
> 若当前的 JSP 是客户端访问的当前 WEB 应用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false, 
则服务器就不会为 JSP 创建一个 HttpSession 对象;

如访问第一个页面是下面的jsp 显示结果为 null

<%@ 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>


> 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,
则服务器也不会为当前 JSP 页面创建一个 HttpSession 对象,而回会把和当前会话关联的那个 HttpSession 对象返回给当前的 JSP 页面.


②. 对于 Serlvet: 若 Serlvet 是客户端访问的第一个 WEB 应用的资源,
则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HttpSession 对象


2). page 指令的 session=“false“  到底表示什么意思?

> 当前 JSP 页面禁用 session 隐含变量!但可以使用其他的显式的 HttpSession 对象

3). 在 Serlvet 中如何获取 HttpSession 对象?

> request.getSession(boolean create): 
create 为 false, 若没有和当前 JSP 页面关联的 HttpSession 对象, 则返回 null; 若有, 则返回 true
create 为 true, 一定返回一个 HttpSession 对象. 若没有和当前 JSP 页面关联的 HttpSession 对象, 则服务器创建一个新的
HttpSession 对象返回, 若有, 直接返回关联的. 

> request.getSession(): 等同于 request.getSession(true)


4). 什么时候销毁 HttpSession 对象:

①. 直接调用 HttpSession 的 invalidate() 方法: 该方法使 HttpSession 失效

②. 服务器卸载了当前 WEB 应用. 

③. 超出 HttpSession 的过期时间.

> 设置 HttpSession 的过期时间: session.setMaxInactiveInterval(5); 单位为秒

> 在tomcat  web.xml 文件中设置 HttpSession 的过期时间: 单位为 分钟. 

  <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

④. 并不是关闭了浏览器就销毁了 HttpSession. 

例子

login.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>
	SessionID:<%=session.getId()%>
	<br>
	<br> IsNew:<%=session.isNew()%>
	<br>
	<br> MaxInactiveInterval:<%=session.getMaxInactiveInterval()%>
	<br>
	<br> CreateTime:<%=session.getCreationTime()%>
	<br>
	<br> LastAccessTime:<%=session.getLastAccessedTime()%>
	<br>
	<br>
	<%
		Object username = session.getAttribute("username");
		if (username == null) {
			username = "";
		}
	%>
	<form action="hello.jsp">
		username:<input type="text" name="username" value="<%=username%>">
		<input type="submit" value="Submit" />
	</form>
</body>
</html>
hello.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>
	SessionId:<%=session.getId()%>
	<br>
	<br> IsNew:<%=session.isNew()%>
	<br>
	<br> MaxInactiveInterval:<%=session.getMaxInactiveInterval()%>
	<br>
	<br> CreateTime:<%=session.getCreationTime()%>
	<br>
	<br> LastAccessTime:<%=session.getLastAccessedTime()%>

	Hello:<%=request.getParameter("username")%>
	<%
		session.setAttribute("username", request.getAttribute("username"));
	%>

	<a href="login.jsp">重新登录</a>
	<a href="logout.jsp">注销</a>
</body>
</html>
logout.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>
	SessionID:
	<%=session.getId()%>
	<br>
	<br> IsNew:
	<%=session.isNew()%>
	<br>
	<br> MaxInactiveInterval:
	<%=session.getMaxInactiveInterval()%>
	<br>
	<br> CreateTime:
	<%=session.getCreationTime()%>
	<br>
	<br> LastAccessTime:
	<%=session.getLastAccessedTime()%>
	<br>
	<br> Bye:
	<%=session.getAttribute("username")%>
	<br>
	<br>

	<a href="login.jsp">重新登录</a>

	<%
		session.invalidate();
	%>
</body>
</html>


浏览器禁用cookie后:

每访问一个页面sessionId都会变化

如果浏览器不支持Cookie,必须自己编程,使用URL重写的方式来实现Session:

URL重写

我们知道session依赖Cookie,那么session为什么依赖Cookie呢?因为服务器需要在每次请求中获取sessionId,然后找到客户端的session对象。那么如果客户端浏览器关闭了Cookie呢?那么session是不是就会不存在了呢?
其实还有一种方法让服务器收到的每个请求中都带有sessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为jSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时也服务器可以通过获取jSessionId这个参数来得到客户端的sessionId,找到sessoin对象。

<form action="<%=response.encodeURL("hello.jsp")%>">
		username:<input type="text" name="username" value="<%=username%>">
		<input type="submit" value="Submit" />
	</form>
<a href="<%=response.encodeURL("login.jsp")%>">重新登录</a>
	<a href="<%=response.encodeURL("logout.jsp") %>">注销</a>





发布了0 篇原创文章 · 获赞 126 · 访问量 92万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章