码迷,mamicode.com
首页 > 其他好文 > 详细

servlet session跟踪实践

时间:2016-05-12 13:17:09      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

一、session简介

1、session概念

Session代表服务器与浏览器的一次会话过程。因为http是无状态的协议,所以,浏览器与服务器的会话过程是断断续续的。在servlet中,session指的是HttpSession对象。
浏览器第一次发出请求时,服务器创建session并生成一个sessionID。然后返回给浏览器。此时查看浏览器的cookie,会发现会有一个:

Cookie:JSESSIONID=sessionID

浏览器再次发出请求时,会携带该cookie,服务器就可以根据sessionID在内存中找到之前创建的session对象。所以“无状态”的HTTP协议就变的“有状态”了。
所以:session是利用了cookie。
所以:静态网页没有servlet,也就没有session的存在。

2、session的创建时间

session是在服务器开始调用函数
HttpSession session = request.getSession(true);
时,如果session还没有被创建,则创建session。

二、session跟踪实践

创建java web工程,创建一个简单的servlet。

package com.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//使用注解的方式注册一个servlet
@WebServlet(name = "SessionTest", urlPatterns = {"/"})
public class SessionTest extends HttpServlet{
    private int counter;//用来标识用户
    public SessionTest() {
        counter = 1;
    }
    public void doGet(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException{
        //如果session不存在就创建一个session
        HttpSession session = request.getSession(true);
        //返回session创建的时间,作为参数生成date对象
        Date creationTime = new Date(session.getCreationTime());
        //返回该客户端最后一次访问的时间,作为参数生成date对象
        Date lastAccessedTime = new Date(session.getLastAccessedTime());

        String title;
        String visitCountKey = "visitCount";
        Integer visitCountValue = new Integer(0);//访问次数
        String userIDKey = "userID";
        String userIDValue;//用户ID

        //客户端是不是第一次访问,没有带包含sessionID的cookie表示第一次访问
        if(session.isNew()){
            title = "欢迎新朋友";
            visitCountValue = 0;
            userIDValue = "Friend" + counter;//给他命名
            counter++;
            //都是key,value的形式设置。把访问次数和用户名都设置进去
            session.setAttribute(userIDKey, userIDValue);
            session.setAttribute(visitCountKey, visitCountValue);
        }
        else{//客户端携带了带sessionID的cookie,取出访问次数,加1后再设置进去
            title = "欢迎老朋友";
            userIDValue = (String)session.getAttribute(userIDKey);
            visitCountValue = (Integer)session.getAttribute(visitCountKey);
            visitCountValue = visitCountValue + 1;
            session.setAttribute(visitCountKey, visitCountValue);
        }

//生成响应给浏览器的页面。
        response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();

          String docType =
          "<!doctype html public \"-//w3c//dtd html 4.0 " +
          "transitional//en\">\n";
          out.println(docType +
                    "<html>\n" +
                    "<head><title>" + title + "</title></head>\n" +
                    "<body bgcolor=\"#f0f0f0\">\n" +
                    "<h1 align=\"center\">" + title + "</h1>\n" +
                     "<h2 align=\"center\">Session 信息</h2>\n" +
                    "<table border=\"1\" align=\"center\">\n" +
                    "<tr bgcolor=\"#949494\">\n" +
                    "  <th>Session 信息</th><th>值</th></tr>\n" +
                    "<tr>\n" +
                    "  <td>id</td>\n" +
                    "  <td>" + session.getId() + "</td></tr>\n" +
                    "<tr>\n" +
                    "  <td>Creation Time</td>\n" +
                    "  <td>" + creationTime + 
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>Time of Last Access</td>\n" +
                    "  <td>" + lastAccessedTime + 
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>User ID</td>\n" +
                    "  <td>" + userIDValue + 
                    "  </td></tr>\n" +
                    "<tr>\n" +
                    "  <td>Number of visits</td>\n" +
                    "  <td>" + visitCountValue + "</td></tr>\n" +
                    "</table>\n" +
                    "</body></html>");
    }
}

可以部署到tomcat,通过访问http://localhost:8080/SessionTest/来查看结果。SessionTest是该web app的名字,由于配置了该servlet的url映射是“/”,所以上面的URL会映射到这个servlet。
简单来说,服务器会把sessionID作为cookie传递给客户端。然后当客户端访问时,服务器根据客户端携带的sessionID,来标识这个客户端,去内存中找到session对象,获取该客户端上次访问的状态信息。
“无状态”指的是浏览器和服务器之间并不存在连接,10个user各访问1次和1个user访问10次对服务器来说是一样的,服务器区分不出来。
加上了session,变的“有状态”了之后呢?
浏览器和服务器之间就存在了一个虚拟连接,同一个浏览器在一次session有效期间,每次访问都携带同一个sessionID,服务器可以根据这个sessionID去内存中找到该session,并获取这个用户上次访问的状态信息。比如,网上看视频时上次观看的进度。

servlet session跟踪实践

标签:

原文地址:http://blog.csdn.net/u010902721/article/details/51366644

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