Cookie是一块可以嵌入到HTTP请求和响应中的数据。典型情况下,Web服务器将Cookie值嵌入到响应的Header,而浏览器则在其以后的请求中都将携带同样的Cookie。Cookie的信息中可以有一部分用来存储会话ID,这个ID被服务器用来将某些HTTP请求绑定在会话中。Cookie由浏览器保存在客户端,通常保存为一个文本文件。Cookie还含有一些其他属性,如可选的注释、版本号及最长生存周期等。
由于统一客户端对服务器的请求都会携带Cookie,因此可以通过在Cookie中添加与会话相关的信息达到会话跟踪的目的。下面我们通过创建一个Servlet来掩饰如何通过Cookie实现会话跟踪。示例代码如下:
package com.yl.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 通过Cookie实现会话跟踪,用户没刷新一次页面,则登录次数+1
*
* @author LYYL
*
*/
@WebServlet(name="servlet", urlPatterns={"/cookietrack"})
public class CookieTrackServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
Cookie cookie = null;
Cookie[] cookies = request.getCookies();
if(cookies != null){
boolean flag = false;
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getName().equals("VisitTimes")){
String v = cookies[i].getValue();
int value = Integer.parseInt(v) + 1;
cookies[i].setValue(Integer.toString(value));
response.addCookie(cookies[i]);
flag = true;
cookie = cookies[i];
}
}
}
if(cookie == null){
int maxAge = -1;
cookie = new Cookie("VisitTimes", "1");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
//显示信息
response.setContentType("text/html; charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<title>Cookie跟踪会话</title>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h2>您好!</h2>");
pw.println("<欢迎您第>"+cookie.getValue()+"次访问该页面<br>");
pw.println("</body>");
pw.println("</html>");
pw.flush();
pw.close();
}
}
本例跟踪的是会话中页面的访问次数。程序通过将页面访问的次数写入一个名为“visitTimes”的Cookie中。由于对页面的请求每次都包含了这个Cookie,因此通过每次将Cookie的值取出来显示页面的访问次数,同时又将更新过的值写入到Cookie来达到会话跟踪的目的。
打开浏览器输入:http://localhost:8080/Servlet/cookietrack,会得到目前的登录次数,每刷新一下页面,登陆次数则+1。