servlet session跟踪实践

一、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,并获取这个用户上次访问的状态信息。比如,网上看视频时上次观看的进度。

时间: 2024-11-05 20:29:43

servlet session跟踪实践的相关文章

Servlet 笔记-Session 跟踪

HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录. 但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话: Cookies 一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别. 这可能不是一个有效的方法,因为很多浏览器不支持 cook

7、Servlet会话跟踪

一.会话跟踪: 不管操作多少功能,都是与当前登录用户相关的信息,当前的登录用户始终没有改变,也就是用户名和密码都没有丢失.但HTTP协议是一个无状态的协议,当一个客户向服务器发出请求(request),在服务器返回响应(response)后,连接就关闭了.这时,在服务器端不保留连接相关的信息,因此当下一次请求连接时,服务器已没有以前连接的信息了,也就无法判断这一次连接和以前的连接是否属于同一客户,也就是说Web服务器无法跟踪客户状态.在 Servlet 规范中,常用以下两种机制完成会话跟踪: a

深入理解JSP/Servlet Session会话管理机制

HTTP 是一种无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息.它与FTP.Telnet等协议不同,FTP等协议可以记住用户的连接信息. 会话(Session)是指一个终端用户与交互系统进行通信的时间间隔,通常指从登陆系统到注销系统之间所经过的时间以及如果需要的话,可能还有一定操作空间.JSP有四种方式实现会话跟踪功能. Cookie 服务器在响应请求时可以将一些数据以"键-值"对的形式通过响应信息保存在客户端.当浏览

Servlet - 会话跟踪

会话跟踪 标签 : Java与Web 会话跟踪 HTTP本身是"无状态"协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连接的内容.因此如果判断两次连接是否是同一用户, 就需要使用会话跟踪技术来解决.常见的会话跟踪技术有如下几种: URL重写: 在URL结尾附加会话ID标识,服务器通过会话ID识别不同用户. 隐藏表单域: 将会话ID埋入HTML表单隐藏域提交到服务端(会话ID不在浏览器页面显示). Cookie: 第一次请求时服务器主

spring-session用redis实现session共享实践

什么是spring session? Spring Session provides an API and implementations for managing a user’s session information. 简单一句话,spring session帮你管理用户的session信息. 为什么使用spring session? 通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将Session保存在服务器内存中

Servlet——Session、ServletConfig、ServletContext

Session的使用 1.取得session对象 req.getSession()方法 2.取得sessionId getId()方法 3.设置session的最大空闲时间 setMaxInactiveInterval() 4.强制session失效 invalidate() 范例: package com.zgy.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.se

Servlet——Session(2)之简单应用

Session技术的应用 1.防止用户非法登录到某个页面 比如我们的用户管理系统,必须要登录成功后才能跳转到主页面,而不能直接绕过登录页面直接到主页面,这个应用是一个非常常见的应用. 这时候,我们需要使用到Session技术,如下,当在验证用户的控制器LoginClServlet.java验证用户成功后,将当前的用户信息保存在Session对象中: // 把user对象保存在session HttpSession session = request.getSession(); session.s

Servlet——Session(3)之实现原理的深入讨论

Session实现原理深入讨论 1.Session实现机制 服务器是如何实现一个session为一个用户浏览器服务的? 解释: 假如浏览器A先访问Servlet1,这时候它创建了一个Session,ID号为110,然后Servlet1将这个ID号以Cookie的方式返回给浏览器A,接着,如果浏览器A继续访问Servlet2,那么这个请求会带上Cookie值: JSESSIONID=110,然后服务器根据浏览器A传递过来的ID号找到内存中的这个Session. 这时候假如浏览器B来访问Servle

JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.H