码迷,mamicode.com
首页 > 编程语言 > 详细

JavaWEB__HttpSession简单总结及小应用

时间:2015-04-26 09:31:27      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:javaweb   jsp   session   

在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表示一次会话:浏览器打开至关闭算一次对话。






JavaWEB__HttpSession简单总结及小应用

标签:javaweb   jsp   session   

原文地址:http://blog.csdn.net/foolishandstupid/article/details/45272951

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!