JavaWEB__HttpSession简单总结及小应用

本文主要介绍了JavaWeb中的Session机制,包括Session的创建、删除条件,以及Session的超时管理和HttpSession接口的主要方法。此外,还展示了如何在实际应用中使用Session实现简易购物车功能,强调了Session在会话跟踪中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Servlet规范中,我们常用两种机制来保持会话跟踪。

–Cookie
–Session 
cookie的机制上一篇已经做了一个简单的总结和简单的应用。这次总结一下session机制。

Session机制:

Session机制采用的是在服务器端保持HTTP状态信息的方案服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,

1.   服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),

2.   如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。

3.  如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存

保存session Id 的几种方式:

1.采用cookie的方式。这样在交互的工程中,浏览器可以自动得按照规则发送给服务器。

2.但cookie可以人为的被禁用,必须有另外的机制来保证在cookie被禁用的情况下把sessionId传回服务器。经常采用的一种技术就是URL重写,即把sessionId附在URL路径的后面。

Session 的创建与删除:

session 的创建直到服务器调用HttpServletRequest.getSession(true)或者HttpServletRequest.getSession()方法时才会被创建。在以下情况下会被删除:

1.调用session.invalidate()方法

2.超过了session的最大有效时间

3.服务器进程被停止。(关闭浏览器只会使浏览器端的session cookie失效,不会使服务器端的session失效)

Session的超时管理:

•WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。
•随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。
WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
•如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。

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

HttpSession接口的方法:

•getId方法
•getCreationTime方法
•getLastAccessedTime方法
•setMaxInactiveInterval方法
•getMaxInactiveInterval方法
•isNew方法
*如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为HttpSession对象不是新建的。
•invalidate方法
•getServletContext方法
•setAttribute方法
•getAttribute方法
•removeAttribute方法
•getAttributeNames方法

HttpServletRequest接口中的session方法

•getSession方法
üpublic HttpSession getSession(boolean create)
üpublic HttpSession getSession()
•isRequestedSessionIdValid方法
•isRequestedSessionIdFromCookie方法
•isRequestedSessionIdFromURL方法 

比如现在要做一个简易的session版购物车


jsp中有一个table:

	<h4>Step1 选择要购买的图书:</h4>
		<!-- 因为在XML中url-partton下的/表示根目录,所以在这也需要加根目录 -->
		<form action="<%=request.getContextPath() %>/processStep1"		method="post">
			<table	border="1" 	cellpadding="10"	cellspacing="0">
					
						<tr>
						<td>书名</td>
						<td>购买</td>
						</tr>
						
						<tr>
						<td>java</td>
						<td><input type="checkbox" name="book" value="java"></td>
						</tr>
						
						<tr>
						<td>Oracle</td>
						<td><input type="checkbox" name="book" value="Oracle"></td>
						</tr>
						
						<tr>
						<td>Struts</td>
						<td><input type="checkbox" name="book" value="Struts"></td>
						</tr>
						
						<tr>
							<td colspan="2">
									<input type="submit" value ="Submit"/>
									</td>
						</tr>
						
			
			</table>
		
		</form>
然后在process1中得到book的数据,并传入到session中:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取选中的图书的信息
		String [] books =request.getParameterValues("book");
		//把图书信息放入session然后传递
		request.getSession().setAttribute("books", books);
		
		//2.重定向到step-2.jsp.绝对路径
		//System.out.println(request.getContextPath()+"/shoppingcar/step2.jsp");
		response.sendRedirect(request.getContextPath()+"/shoppingcar/step2.jsp");
		
	}
同样得,step2也有个table :

在processStep2中得到这些信息,并用这些信息创建一个Customer的对象,并传入session中。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			//1.获取请求参数name,address,cardType,cardNumer
		String name =request.getParameter("name");
		String address=request.getParameter("adress");
		String cardType= request.getParameter("cardType");
		String cardNum=request.getParameter("cardNum");
			//2.把请求信息存入到session
		Customer customer=new Customer(name, address, cardType, cardNum);
		request.getSession().setAttribute("customer", customer);
//		request.getSession().setAttribute("name", name);
//		request.getSession().setAttribute("address", address);
//		request.getSession().setAttribute("cardType", cardType);
//		request.getSession().setAttribute("cardNum", cardNum);
		
			//	3.重定向到confim.jsp
		response.sendRedirect(request.getContextPath()+"/shoppingcar/confim.jsp");
	}

最后在confim.jsp中得到这些数据并输出。

其实用法大都差不多,就是把数据传入到session中,并在其他页面得到该数据。因为session表示一次会话:浏览器打开至关闭算一次对话。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值