在Servlet规范中,我们常用两种机制来保持会话跟踪。
Session机制采用的是在服务器端保持HTTP状态信息的方案。服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,
1. 服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),
2. 如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
3. 如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。
1.采用cookie的方式。这样在交互的工程中,浏览器可以自动得按照规则发送给服务器。
2.但cookie可以人为的被禁用,必须有另外的机制来保证在cookie被禁用的情况下把sessionId传回服务器。经常采用的一种技术就是URL重写,即把sessionId附在URL路径的后面。
session 的创建直到服务器调用HttpServletRequest.getSession(true)或者HttpServletRequest.getSession()方法时才会被创建。在以下情况下会被删除:
1.调用session.invalidate()方法
2.超过了session的最大有效时间
3.服务器进程被停止。(关闭浏览器只会使浏览器端的session cookie失效,不会使服务器端的session失效)
<session-config> <session-timeout>30</session-timeout> </session-config>
比如现在要做一个简易的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表示一次会话:浏览器打开至关闭算一次对话。
原文地址:http://blog.csdn.net/foolishandstupid/article/details/45272951