会话跟踪 - 四个方法

23 篇文章 0 订阅

1. 会话跟踪

背景:传统HTTP协议的服务端并不能存储任何有关用户状态的信息

会话跟踪:上次请求传递、修改的数据能够影响到下次请求,并且能识别出是相同客户端发送出来的。


    一次会话的简单流程

打开浏览器
访问服务器内容
关闭浏览器



1.1 Cookie - 重要数据写给客户端

前提:确保浏览器允许使用Cookie

数据保存位置: 客户端上 ---- 一个Cookie对应一个键值对

跟踪思想: 客户端第一次请求,服务器在返回报文上将Cookie发给客户端,客户端将Cookie信息存储在一个文件上,客户端每次请求时,便Cookie信息放在请求报文里面,服务器根据请求报文的信息从而进行比对、确认客户端身份。

注意1: 任何身份都有时效性,例如自己身份证有效期,Cookie也是一样,时效一过,只能下次请求时,服务器自动颁发一张新的身份证给你。

注意2: 客户端收到的Cookie都是 resp.addCookie (Cookie)、换句话说服务器给客户端的Cookie都需要自己写代码给客户端,而客户端Cookie会自动给服务器,客户无需任何动作

注意3: Cookie的键值对不能有空格符,非要有空格必须将其进行转码。

1.1.1 Cookie在B/S的流程图

   Cookie流程图

客户端(浏览器) 服务器(ser Servlet对象 ① 请求HTTP(第一次) ② 查找、并传递Http请求对象 ③ 含有Cookie的Http回应报文 ④ Http回应保文 ⑦ 请求HTTP(含有Cookie) ② 传递request对象(Cookie信息) 客户端(浏览器) 服务器(ser Servlet对象

1.1.2 Cookie类、缺点

此是 javax.servlet.http.Cookie,不是 java.net.HttpCookie;

Cookie缺点
浏览器禁用Cookie时,客户端不在存储Cookie
Cookie是存储在客户端一个文本文件、能被用户自 行删除
Cookie是文本文件、存储密码重要信息时最好经过服务器加密
每个Cookie保存的数据不能超过4095字节、每个域名只能50个Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lv49lXoE-1572864684320)(en-resource://database/7393:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2dkqy5Vi-1572864684328)(en-resource://database/7395:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WACKE8eZ-1572864684398)(en-resource://database/7397:1)]

Cookie类方法
getXXX()
获取描述信息、Cookie键值对、地址栏输入什么地址才发送Coonkie到如武器
setXXX()
setDomain(String):设置域名
setPath(String):设置后缀名
setMaxAge(int):>0存活的秒数、=0通知客户端删除Cookie、<0浏览器关闭就删除Cookie
上面get有的信息都可以更改,除了(Cookie.name)
clone()
复制当前的Cookie对象
注意:根据两者来决定是否发送Cookie

HttpServletRequest.getCookies() → 得到请求报文中的所有Cookies
HttpServletResponese.addCoooke( Coookie ) → 将Cookie放入回复报文上

1.1.3 代码测试
@WebServlet(urlPatterns = {"/CookieTest.do"})
public class CookieTest extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Cookie ck_name = new Cookie("name","lrc");
		Cookie ck_year = new Cookie("year","18");
		ck_name.setDomain("localhost");      // 满足1:域名是localhost
		ck_year.setDomain("localhost");
		ck_name.setPath("/");                  // 满足2:地址栏  localhost/*  客户端就可以发送cookie给服务器
		ck_year.setPath("/JavaWeb_learning");   // 地址栏  localhost/JavaWeb_learning/* 客户端就会发送Cookie给服务器
		ck_name.setMaxAge(240);     // Cookie在客户端的存活时间4分钟
		ck_year.setMaxAge(240);
		resp.addCookie(ck_name);    // 将Cookie放置在 返回报文 给客户端
		resp.addCookie(ck_year);
        
		PrintWriter pw = resp.getWriter();
		pw.write("<h1>A new Cooking is being retured to the client</h1>");
		pw.flush();
		pw.close();
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.service(req, resp);
	}
	
}



运行上述代码测试步骤

  1. Tomcat服务器已经加载了两个应用程序
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zf7jhBX6-1572864684399)(en-resource://database/7399:1)]

  2. 地址栏输入:http://localhost:8080/JavaWeb_learning/CookieTest.do生成Cookie给客户端
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qb76aXJe-1572864684403)(en-resource://database/7401:1)]

  3. 地址栏输入这几个地址:localhost:8080、localhost:8080/任意层级域名都没有出现year这个Cookie
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2j264eIt-1572864684408)(en-resource://database/7403:1)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKt07sdp-1572864684412)(en-resource://database/7405:1)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hIgIliY-1572864684415)(en-resource://database/7407:1)]

  4. 地址栏输入:http://localhost:8080/JavaWeb_learning只有匹配URL:localhost/JavaWeb_learning/* 才会将year Cookie给服务器
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryGCkf0z-1572864684426)(en-resource://database/7409:1)]


1.2 Session - 数据写给服务器

1. 依然使用了Cookie、不过只用Cookie的话,会把大量的状态信息存到客户端主机上,而使用Cookie-Session结合,客户端只需要存储SessionID就可以了,大量的状态信息存在服务器Session这个内存空间上,减少了HTTP请求携带大量的用户状态Cookie信息


2. 服务器只要新生成Session,则自动会将sessionID发送给客户端


3. 浏览器关闭则客户端的Cookie-SessionID自动删除,但服务器的session并没有销魂

1.2.1 Session在B/S的流程图
客户端(浏览器) 服务端(Ser Servlet对象1 Session会话1 ① 请求HTTP ② 查找 ③ 生成会话1 ④ 将会话ID写入回应保文中 ⑤ 含有SessionID-Cookie的报文 ⑥ 找到会话,存储新数据在会话中、分派到另一个页面 客户端(浏览器) 服务端(Ser Servlet对象1 Session会话1

1.2.2 Session类

生成HttpSession对象: HttpServletRequest.getSession()

HttpSession接口
getXXX():获取属性名、属性值、Session创建时间、会话ID、会话最新访问时间、存活时间、servlet与该session关联的上下文
setAttribute(String, Object):添加、修改session属性
removeAttribute(String):删除Session某个属性
用于会话域、保存客户端状态数据
invalidate():销魂Session对象、同时以报文形式告诉客户端删除Cookie中的seesionID

1.2.3 Session失效时间设置
最低优先级
次优先级
最高优先级
失效时间
Tomcat目录下的配置文件:conf/web.xml
自己项目下的配置文件:WebContent/WEB-INF/web.xml
运行时代码设置:session.setMaxInactiveInterval(秒数)


  服务器级session配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPrmSN7w-1572864684429)(en-resource://database/7867:1)]

  项目级session配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioiJcwg5-1572864684432)(en-resource://database/7869:1)]

  代码级session配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dakrQmhE-1572864684436)(en-resource://database/7865:1)]

1.2.4 代码测试
@WebServlet (urlPatterns = {"/cookie.do"})
public class TestCookie1 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 如果客户端请求中没有sessionID,服务器会自动创建一个新的session,并且将新的sessionID给客户端
		req.getSession();     
	}
}


  第一次请求 – 请求报文中没有sessionID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npfHz1cC-1572864684440)(en-resource://database/7871:1)]


  第二次请求 – 客户端自动将sessionID给服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kbjUOfvW-1572864684443)(en-resource://database/7873:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K75tsXD9-1572864684446)(en-resource://database/7875:1)]


  第三次请求 – 浏览器关闭(或者换个浏览器),打开新浏览器 → 上次的sessionID(Cookie)已经被删除,服务器重新发送新的sessionID,但服务器原来的session并没有删除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHSTVOz0-1572864684449)(en-resource://database/7877:1)]

1.3 URL重写

背景: 客户端禁用Cookie,导致不能存储sessionID,所以只能通过后台程序员给请求的URL进行补充sessionID,或者客户端人员自己手动在地址栏补充sessionID ---- 即增加会话标识


超链接、表单的action、重定向地址 都必须重写URL(JSP页面) ---- 静态html页面不可以动态重写


注意: 请求报文中有sessionID则使用请求中的sessionID,即使地址栏你手动拼接了另一个sessionID,则依然使用请求报文中的sessionID。

1.3.1 URL重写方法
jsessionid必须小写
URL重写方法
客户端自己在地址栏补充sessionID:
localhost:8080/项目名/Servlet;jsessionid=id编号
response.encodeURL(String)
esponse.encodeRedirectURL(String)
两者一样

1.3.2 代码测试

  servlet代码 - TestCookie1.java

@WebServlet (urlPatterns = {"/cookie.do"})
public class TestCookie1 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {		
		HttpSession hs = req.getSession();
		hs.setAttribute("sessionID", hs.getId());
		hs.setAttribute("用户", "小明");
	}
}


  jsp代码 - TestSession.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	String scheme = request.getScheme(); 
	String server = request.getServerName(); 
	int port = request.getServerPort(); 
	String project = request.getContextPath(); 
	String base = scheme + "://" + server + ":" + port + project + "/";
%>    
<!DOCTYPE html>
<html>
<head>
<base href="<%=base%>">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	sessionID:<%= session.getAttribute("sessionID") %>
	<br>
	用户名:<%= session.getAttribute("用户") %>
</body>
</html>



  未禁用Cookie时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qCApAfc-1572864684452)(en-resource://database/7879:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DV1NpxP7-1572864684456)(en-resource://database/7881:1)]

  禁用Cookie时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX7VkWl1-1572864684460)(en-resource://database/7883:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qJNYIrk-1572864684464)(en-resource://database/7885:1)]

1.3.2.1 客户端地址栏手动输入sessionID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYaM5aK4-1572864684530)(en-resource://database/7887:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jkikri9d-1572864684537)(en-resource://database/7889:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUpNbYY0-1572864684539)(en-resource://database/7891:1)]

1.3.2.2 encodeRedirectURL(String)=encodeURL(String) - 自动填充sessionID

  重定向引用的时上面的jsp页面

@WebServlet (urlPatterns = {"/cookie.do"})
public class TestCookie1 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		
		HttpSession hs = req.getSession();
		hs.setAttribute("sessionID", hs.getId());
		hs.setAttribute("用户", "小明");
		resp.sendRedirect("/JavaWeb_servlet/TestSession.jsp");   // ①
//		String bringSessionPath =           resp.encodeRedirectURL("/JavaWeb_servlet/TestSession.jsp");      // ②
//		resp.sendRedirect( bringSessionPath );              // ③
	}
}


  运行①代码 - 请求localhost:8080/cookie.do
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5Na0L50-1572864684542)(en-resource://database/7893:1)]

  运行②③代码、注释①代码 - 请求localhost:8080/cookie.do
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KOreOMrc-1572864684546)(en-resource://database/7895:1)]

1.4 隐藏的表单域 - 利用标签存储session

背景:浏览器禁用Cookie,可以在给客户端的每个JSP页面保存一个进行存储sessionID

1.4.1 时序过程图
hiddenForm TestCoookie1.java message.jsp 转到页面处理Servlet 抽取sessionID,拼接URL,重定向 hiddenForm TestCoookie1.java message.jsp
1.4.2 代码示例

文件结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3esxDs6e-1572864684551)(en-resource://database/7899:1)]

  hiddenForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	String scheme = request.getScheme(); // http
	String server = request.getServerName(); // localhost
	int port = request.getServerPort(); // 8080
	String project = request.getContextPath(); // /项目名
	String base = scheme + "://" + server + ":" + port + project + "/"; // http://localhost:8080/homework/
%>    
    
<!DOCTYPE html>
<html>
<head>
<base href="<%=base%>">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		HttpSession hs = request.getSession();
		String sessionID = hs.getId();
		hs.setAttribute("user", "小明");
		hs.setAttribute("password", "123456");
	%>
	<form action="./cookie.do" method="post">
		<input type="hidden" name="sessionID" value="<%= sessionID %>">
	</form>
	<a href="">重定向到用户信息页面</a>
</body>

<script>
	var a = document.getElementsByTagName("a")[0];
	var form = document.getElementsByTagName("form")[0];
	a.onclick = function() {		
		form.submit();
		return false;  // 取消a标签默认行为
	}
	
</script>
</html>

  TestCoookie1.java

@WebServlet (urlPatterns = {"/cookie.do"})
public class TestCookie1 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		String sessionID = req.getParameter("sessionID");
		resp.sendRedirect("/JavaWeb_servlet/message.jsp" + ";jsessionid=" + sessionID);
	}
}

  message.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	String scheme = request.getScheme(); // http
	String server = request.getServerName(); // localhost
	int port = request.getServerPort(); // 8080
	String project = request.getContextPath(); // /项目名
	String base = scheme + "://" + server + ":" + port + project + "/"; // http://localhost:8080/homework/
%>    

<!DOCTYPE html>
<html>
<head>
<base href="<%=base%>">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	用户:<%= session.getAttribute("user")%>
	密码:<%=  session.getAttribute("password") %>
	
	<form method="post">
		<input type="hidden" name="sessionID" value="<%= session.getId() %>" >
	</form>
</body>
</html>


  运行结果图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0LWin6rv-1572864684558)(en-resource://database/7901:1)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Tiq0sw2-1572864684568)(en-resource://database/7903:1)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值