在Servlet规范中,我们常用两种机制来保持会话跟踪。
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的超时管理:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
HttpSession接口的方法:
HttpServletRequest接口中的session方法
比如现在要做一个简易的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表示一次会话:浏览器打开至关闭算一次对话。