会话跟踪技术

2024-01-08 15:05:47

主要内容

  • Cookie技术
  • session技术
  • URL重写技术
  • 隐藏表单域技术


前情提要

? ? ? ?客户端与服务器进行通信的协议是HTTP协议,该协议本身是基于请求/响应模式的、无状态的协议,服务器不会记录客户端的任何信息,这样客户端每次发送的请求都是独立的,这样的方式在工程实践中是不可用的。而会话(session)正式一种能将客户端信息保存在服务器端的技术,它可以记录客户端到服务器的一系列请求。

? ? ? 会话跟踪技术作为在客户端与服务器之间保持HTTP状态的解决方案,主要包括Cookie技术、session技术、URL重写技术以及隐藏表单域技术。

Cookie技术

在客户端保持会话跟踪

? ? ? ?Cookie技术是一种在客户端保持会话跟踪的解决方案。通过Cookie,服务器在接收来自客户端浏览器的请求时,能够通过分析请求头的内容得到客户端特有的信息,从而动态生成与该客户端相对于的内容。例如,在登录页面中记住密码。另外一些商业网站根据用户的偏好,进行风格设置、广告投放等个性化推荐功能,这些功能都可以通过存储在客户端的Cookie实现。

? ? ? Cookie可以通过java.servlet.http.Cookie类的构造方法Cookie(String name,String value)创建,示例代码入下:

Cookie vistedCountC = new Cookie("vistedCount","1000");

其中第1个参数name用于指定Cookie的属性名;第2个参数的value用于指定属性值。

? ? ? ?创建完成的Cookie可以使用HttpServletResponse对象的addCookie()方法添加到响应对象中,进而让Cookie对象存储在客户端机器上。存储在客户端的Cookie可以通过HttpServletRequest对象的getCookies()方法获取。

? ? ? ?Cookie有一定的存货时间,不会在客户端一直保存。默认情况下,在浏览器关闭时失效。若要让其长时间保存,可以通过Cookie对象的setMaxAge(int time)方法设置其存活时间(以秒为单位)若为正整数表示其存活的秒数;若为负数,表示其为临时Cookie(在浏览器关闭时失效);若为0,表示通知浏览器删除响应的Cookie对象。

【例1】编写一个Servlet,在该Servlet中测试Cookie对象se常用方法。

CookieTest.java

package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpeDateFormat;
import java.util.Date;
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;
@WebServlet("/CookieTest")  //注解部署Servlet
public class CookieTest extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequset request,HttpServletResponse response) throws ServletException,IOException {
       response.setContentType("text/html;charset=UTF-8");//设置响应方式
       printWriter out = response.getWriter();
       SimpleDateFormat sdf = new SimpeDateFormat("yyyy年MM月dd日HH:mm:ss");
       String nowTime = sdf.format(new Date());
       String lastVisTime = "";//访问时间
       int vistedCount = 0;//访问次数
       //获取客户端浏览器保存的所有Cookie
       Cookie[] myCookies = request.getCookies();
       if(myCookies != null){
          for(Cookie cookie : myCookies){
             if( "lastVist".equals(cookie.getName())) ){
                 lastVistTime = cookie.getValue();
             }
             if( "vistedCount".equals(cookie.getName())) ){
                 vistedCount = Integer.valueOf(cookie.getValue());
             }
          }
       }
       //不是第一此访问,输出上次访问时间
       if(!"".equals(lastVistTime)){
            out.println("您上次访问时间为:"+lastVistTime);
       }
       //输出访问次数
       out.println("您是第:"+(vistedCount+1)+“次访问该网站。”);
       //以本次访问时间创建同名Cookie
       Cookie lastVistTimeC = new Cookie("lastVist",nowTime);
       //设置最大存活时间为1年
       lastVistTimeC.setMaxAge"(365*24*60*60);
       //以访问次数创建同名Cookie
       Cookie vistedCountC = new Cookie("vistedCount",(vistedCount + 1)+"");
       //设置最大存活时间为1年
       vistedCountC.setMaxAge"(365*24*60*60);
       //将两个Cookie对象响应到客户端
       response.addCookie(lastVistTimeC);
       response.addCookie(vistedCountC);
     }
     protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
         doGet(request,response);
     }
}

启动服务器,第1次请求CookieTest后(http://localhost:8080/ch7/CookieTest)的显示结果为:

您是第: 1次访问该网站。

第2次请求CookieTest后(http://localhost:8080/ch7/CookieTest)的显示结果为:

您上次访问时间为:2018年10月16日11:33:35 您是第2次访问该网站。

session技术

? ? ? ?session技术是指使用HttpSession对象实现会话跟踪技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象将在用户第1次访问服务器时由容器创建(只有访问JSP、Servlet等程序时才会创建,只访问HTML、image等静态资源并不会创建),当用户调用其失效方法invalidate()或超过其最大不活动时间时会失效。在会话有效期间,用户与服务器之间的多次请求都属于同一个会话。

? ? ? ?服务器在创建session对象时,会为其分配一个唯一的会话标识sessionId,以JSESSIONID的属性名保存在客户端的Cookie中。在用户后续的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。

URL重写技术

? ? ? URL重写是指服务器程序对接收的URL请求重新写成网站可以处理的另外一个URL的过程。URL重写技术是实现动态网站会话跟踪的重要保障。使用URL重写技术可以对请求的URL地址追加会话标识,从而实现用户的会话跟踪功能。

//对重定向的URL进行重写
String encodeURL = response.encodeRedirectURL("toRedirectServlet");
response.sendRedirect(encodeURL);

隐藏表单域技术??

? ? ?利用HTML的hidden属性,将客户端的信息,在用户不察觉的情形下,随着请求一起发送给服务器处理。例如:

<input type="hidden" name="userID" vlaue="15">

文章来源:https://blog.csdn.net/weixin_60415234/article/details/135370692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。