会话跟踪
文章目录
一.会话概念:
1.定义:
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话 。理论是,一个用户的所有请求操作都应该属于同一个会话。
2.会话跟踪
对同一个用户对服务器的连续的请求和接受响应的监视
1)为什么需要会话跟踪
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求 。
2)会话跟踪实现方式
-
Cookie
-
Session
只在jsp页面生效
-
URL 重写
二.Cookie
1.定义
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response
向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再次请求该网站时,浏览器会把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态客户端
客户端请求服务器时,cookie保存在浏览器,下次在再浏览器请求相同网站时,浏览器会把保存的cookie调用
cookie存放路径:
Google浏览器:C:\Users\ASUS\AppData\Local\Google\Chrome\User Data\Default\Network\cookies
2.Cookie对象保存方式
- 一种方式是 保存在客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。
- 另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内。 这样就实现了对客户的跟踪。
<!--jsp页面-->
<%
String username = "";
String password = "";
//通过 request.getCookies()得到浏览器的cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
//得到cookie的key
String name = cookie.getName();
if (name.equals("username")) {
//匹配键值value
username = cookie.getValue();
}
if (name.equals("password")) {
password = cookie.getValue();
}
}
}
%>
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//负责处理login.jsp提交
//获取提交对象的username和password
String username = req.getParameter("username");
String password = req.getParameter("password");
Hr hr = hrService.login(username, password);
//
HttpSession session = req.getSession();
session.setAttribute("hr", hr);
if (hr != null) {
//本地存储,在浏览器存储数据
Cookie[] cookies = req.getCookies();
boolean flag = false;
for (Cookie cookie : cookies) {
String name = cookie.getName();
if (name.equals("username")) {
flag = true;
}
}
if (!flag) {//如果request中的cookie没有,重写cookie
Cookie username1 = new Cookie("username", username);
Cookie password1 = new Cookie("password", password);
//设置cookie存储路径
username1.setPath("/hrms");
password1.setPath("/hrms");
//设置cookie有效期
username1.setMaxAge(60 * 60 * 24);
password1.setMaxAge(60 * 60 * 24);
resp.addCookie(username1);
resp.addCookie(password1);
}
//路径可以: ../退yi或/hrms根路径下的页面
resp.sendRedirect("/hrms/admin.jsp");
} else {
resp.sendRedirect("../login.jsp");
}
}
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 |
三、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存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险。
,可把Session看做是一个Java容器类。
2.2、从隐私安全上比较
Cookie存储在客户端浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险。
如果选用Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到Cookie中,最好是将Cookie信息加密,提交到服务器后再进行解密。