5.会话跟踪
本章目标:
- 什么是会话
- Cookie
- Session
本章内容:
一、什么是会话
1、什么是会话
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话 。理论是,一个用户的所有请求操作都应该属于同一个会话。
2、什么是会话跟踪
对同一个用户对服务器的连续的请求和接受响应的监视
3、为什么需要会话跟踪
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求 。
4、会话跟踪实现方式
- Cookie
- Session
- URL 重写
二、Cookie
1、什么是Cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再次请求该网站时,浏览器会把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态客户端
cookie存放位置(Win10):
IE浏览器:%APPDATA% 目录中的xxx.txt文件 (IE浏览器分开存放的)。 火狐浏览器:%APPDATA% 目录中的xxx.default目录,名为cookies.sqlite的文件。 谷歌浏览器:%LOCALAPPDATA%Data 目录中,名为Cookies的文件
我电脑上Firefox的位置:C:\9z3ggy7t.default-release
2、Cookie对象保存方式
可以采用两种方式来保存这个Cookie对象:
- 一种方式是 保存在客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。
- 另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内。 这样就实现了对客户的跟踪。
注意:Cookie功能需要浏览器的支持。如果浏览器不支持Cookie或者把Cookie禁用了,Cookie功能就会失效。不同的浏览器采用不同的方式保存Cookie。
3、常用方法
方法 | 说明 |
---|---|
public void setDomain(String pattern) | 设置 cookie 的域名,如 biancheng.net |
public String getDomain() | 获取 cookie 的域名 |
public void setMaxAge(int expiry) |
设置 cookie 有效期,单位:秒 默认仅在当前会话中存在 |
public int getMaxAge() | 获取 cookie 有效期,单位:秒 默认为 -1,表示 cookie 保存到浏览器关闭为止 |
public String getName() | 返回 cookie 的名称,名称创建后将不能被修改 |
public void setValue(String newValue) | 设置 cookie 的值 |
public String getValue() | 获取 cookie 的值 |
public void setPath(String uri) | 设置 cookie 的路径 默认为当前页面目录以及子目录下的所有 URL |
public String getPath() |
获取 cookie 的路径 |
public void setSecure(boolean flag) | 设置 cookie 是否要加密传输 |
public void setComment(String purpose) | 设置 cookie 注释 |
public String getComment() | 返回 cookie 注释,如果 cookie 没有注释,则返回 null |
4、示例
注意:idea配置tomcat部署路径不能配置为/,要配置成/xxx,否则无法把cookie写入到本地系统中
-
页面
<%@ page language=“java” import=“java.util.*” contentType=“text/html;charset=GBK”%> <% String path = request.getContextPath(); String basePath = request.getScheme() + “://” + request.getServerName() + “:” + request.getServerPort() + path + “/”; %> <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”> <head> </head> <body> <% String username = ““; String password =”“; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { String name = cookie.getName();//得到cookie中存储的对应的key //如果cookie的key值为username,则取得key对应的值,并赋值给变量username if (”username”.equals(name)) { username = cookie.getValue(); } if (“password”.equals(name)) { password = cookie.getValue(); } } } %> <form action=“servlet” method=“POST”> 用户名<input type=“text” value=“<%=username%>” name=“username”/> 密码<input type=“text” value=“<%=pwd%>” name=“pwd”/> <input type=“submit” value=“ok”/> </form> </body>
-
java文件
package com.woniuxy; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieTest extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter(“username”); String password = request.getParameter(“password”); Hr hr = hrService.login(username, password); if (hr!=null) {//如果后台数据库有,则登录成功,否则 回到登录页面 Cookie[] cookies = request.getCookies(); boolean flag = false; for (Cookie cookie : cookies) { System.out.println(cookie.getDomain()); if (“username”.equals(cookie.getName())) {//判断cookie数组中没有对应的key为username flag = true; } } if(!flag){//如果request中的cookie中没有username的key,再写cookie Cookie cookieName = new Cookie(“username”, username);//创建cookie对象 Cookie cookiePwd = new Cookie(“password”, password); cookiePwd.setMaxAge(60*60*24); cookieName.setMaxAge(60*60*24); response.addCookie(cookieName);//通过该方法把cookie写到浏览器中 response.addCookie(cookiePwd); } HttpSession session = request.getSession();//得到session对象 session.setAttribute(“hr”,hr);//把hr存储到session中,在页面各个地方都可以取得值 response.sendRedirect(“../admin.jsp”); }else { response.sendRedirect(“../login.jsp”); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
注意:如果无法保存cookie,可以通过setPath方法来设计取值路径,参考如下
//setPath设置Cookie的有效访问路径。有效路径指的是Cookie的有效路径保存在哪里, // 那么浏览器在有效路径下访问服务器时就会带着Cookie信息,否则不带Cookie信息。 cookiePwd.setPath(“/hrms”); cookieName.setPath(“/hrms”);
三、Session
1、实现原理
Session是另一种记录客户端状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。客户端浏览器再次访问时只需要从该Session中查询该客户的状态就可以了
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。 在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户 Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效 .
Session在用户第一次访问服务器的时候自动创建。需要注意的是,只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
2、Session与Cookie的比较
2.1、从存取方式上比较:
- Cookie中只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8、GBK或者BASE64等方式的编码。Cookie中也不能直接存取Java对象,若要存储稍微复杂的信息,使用Cookie是比较困难的。
- 而Session中可以存取任何类型的数据,包括String、Integer、List、Map等。Session中也可以直接保存JavaBean及至任何Java对象等,使用起来非常方便,可把Session看做是一个Java容器类。
2.2、从隐私安全上比较
Cookie存储在客户端浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险。
如果选用Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到Cookie中,最好是将Cookie信息加密,提交到服务器后再进行解密。
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18843147