会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
在程序中,会话跟踪是很重要的事情。WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)
理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
但是Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
<form action ="index.jsp" method="post"> name :<input type="text" name="name"/> <input type="submit" value="Submit"/><pre name="code" class="java"></form>
<%
//得到传入的name属性的值
String value =request.getParameter("name");
//判断不为空
if(value !=null&&!value.trim().equals("")){
//用"name"和该值创建一个cookie实例化对象需要传进一个键值对。
//key=name;value=value
Cookie cookie =new Cookie("name",value);
//该方法设置cookie存在的时间,表示存在30S
cookie.setMaxAge(30);
//将该cookie插入HTTP响应报头中。
response.addCookie(cookie);
}else{
//后续访问,就可以得到请求中的cookies
Cookie [] cookies =request.getCookies();
if(cookies!=null &&cookies.length>0){
//遍历cookies数组,因为可能包含很多个不同的cookie信息
//需要从中找出key=name对应的value.
for(Cookie cookie:cookies){
String cookieName =cookie.getName();
if("name".equals(cookieName)){
String value2 =cookie.getValue();
value =value2;
}
}
}
}
//如果名字存在,将登陆信息直接打印出来
if(value !=null&& !value.trim().equals("")){
out.println("Hello:"+value);
}else {
//否则调用重定向,将页面回到初始页面
response.sendRedirect("login.jsp");
}
%><H4>Book Page</H4> <a href="book.jsp?book=javaweb">javaweb</a><br><br> <a href="book.jsp?book=java">java</a><br><br> <a href="book.jsp?book=oracle">oracle</a><br><br> <a href="book.jsp?book=Ajax">Ajax</a><br><br> <a href="book.jsp?book=spring">spring</a><br><br> <a href="book.jsp?book=jdbc">jdbc</a><br><br> <a href="book.jsp?book=mvc">mvc</a><br><br> <br><br>book.jsp:
<h4>Book Detail Page</h4>
Book :<%=request.getParameter("book") %>
<br><br>
<a href="books.jsp">Return </a>
<%
String book=request.getParameter("book");
//确定要删除的cookie
Cookie [] cookies=request.getCookies();
//保存所有的book开头的cookie
ArrayList<Cookie> bookCookies =new ArrayList();
Cookie tempCookie =null;
if(cookies!=null &&cookies.length>=0){
for(Cookie c:cookies){
String cookName =c.getName();
if(cookName.startsWith("BOOK")){
bookCookies.add(c);
if(c.getValue().equals(book)){
tempCookie=c;
}
}
}
}
if(bookCookies.size()>=5 &&tempCookie == null){
tempCookie=bookCookies.get(0);
}
if(tempCookie != null){
tempCookie.setMaxAge(0);
response.addCookie(tempCookie);
}
//把book.jsp传入的book作为一个Cookie返回
Cookie cookie =new Cookie("BOOK"+book,book);
response.addCookie(cookie);
%>然后需要在books.jsp页面下方显示最近的浏览记录,所以在boos.jsp加入以下代码: <%
//显示最近浏览的5本书
//获取所有的cookie
Cookie [] cookies=request.getCookies();
//筛选出book的cookie,如果cookiename为atguigu的开头即符合条件
if(cookies!=null &&cookies.length>=0){
for(Cookie c:cookies){
String cookName =c.getName();
if(cookName.startsWith("BOOK")){
out.println(c.getValue());
}
}
}
%>以上即完成了一个小程序,能显示最近浏览的5本书的记录。当然还有很多需要完善的地方。
原文地址:http://blog.csdn.net/foolishandstupid/article/details/45202751