Session是服务端使用记录客户端状态的一种机制,Session使用简单,但是和Cookie相比,增加了服务器的存储压力【因为为了追求速度,服务器将Session放置在了内存中】。Cookie是保存在客户端的,然而Session是保存在服务器上的。初次访问的服务端的时候会把客户端的信息保存起来,再次访问的时候直接从Session中获取即可。【客户端初次访问服务器的时候会自动创建Session,如果没有生成Session则可以使用request.getSession(true)方式强制生成Session】

  但是值得注意的是,Session的使用需要Cookie的支持,因为单独的Session还是无法知道当前访问服务器的是否是同一个客户端,它要根据存储在Cookie中的JSESSIONID来进行判断[这个Cookie是客户端自动创建的],如果客户端关闭了Cookie,那么Session是没有什么效果的。这个时候,需要使用URL重写的方式,将JSESSIONID直接放置在URL中,访问服务器的时候可以直接进行解析。

  大家都知道Cookie是可以设置过期时间的,它允许设置永久有效,并且它是存储在客户端电脑上的,并不会占用服务器的内存。所以如果想实现"永久登录"的话,使用Cookie是首选,并且Cookie中可以通过设置domain属性,来达到跨域使用[多个窗口公用Cookie]。然而Session需要占用太多的服务器内存,并且不支持跨域使用,不同的窗口访问客户端都会创建一个Session,Session过多会造成内粗溢出【当然服务端也有相应的措施应对溢出,那就是通过设置Session的有效期,有效期到达之后就会将Session清除】

  但是Session中可以存储多种类型的数据,不仅能存储String还可以直接存储一个javaBean对象,然而Cookie中仅仅能存储String。并且Session的安全性要比Cookie的安全性高的多,因为它是存储在服务器上的,外部人员不能轻易更改,然而Cookie是保存在客户端电脑上的,随时都有可能被更改,虽然说可以将信息加密,然后存储在Cookie中,但是跟Session相比,安全性还是比较低的。

  所以通常"会话跟踪"的时候,通常是两者配合使用以达到想要的效果!

*:通常利用Session保存当前登录用户的信息,我们可以操作Session(如:移除Session中的userInfo或者设置Session失效),当Session中没有userInfo则跳转到登录界面进行登陆操作【也就意味着该用户已经下线】,所以通常都是操作Session来进行【踢出用户】操作,使用户被迫下线。

一:代码演示:利用Session存储用户信息,然后在欢迎界面获取用户信息【此处登录界面和欢迎界面是一个】

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>演示Session的使用</title>
 8 </head>
 9 <body>
10     <!-- 利用JSP的行为创建一个User实例 ,存放在默认的page域中-->
11     <jsp:useBean id="user" class="cn.woo.entity.User" scope="page"></jsp:useBean>
12     <jsp:setProperty property="username" name="user" value="woo"/>
13     <jsp:setProperty property="password" name="user" value="123456"/>
14
15     <%!
16         //定义要显示的错误提示信息
17         String message = "";
18         //登录标志
19         boolean login = false;
20     %>
21
22     <!-- 接收请求 -->
23     <%
24         System.out.println(request.getMethod());
25         if(request.getMethod().equalsIgnoreCase("post")){
26             request.setCharacterEncoding("utf-8");
27             response.setCharacterEncoding("utf-8");
28
29             //获取用户名和密码
30             String username = request.getParameter("username");
31             String password = request.getParameter("password");
32
33             //验证用户名和密码是否正确
34             if((username!=null && !username.isEmpty()) && (password!=null && !password.isEmpty())){
35                 if((username.equals(user.getUsername())) && (password.equals(user.getPassword()))){
36                     login = true;
37                     //利用Session记录用户信息
38                     session.setAttribute("userInfo",user);
39                     //重定向至该页面,添加参数System.currentTimeMillis(),防止客户端缓存页面数据
40                     response.sendRedirect(request.getRequestURI() "?" System.currentTimeMillis());
41                     return;
42                 }else{
43                     message = "用户名密码错误请重新登录";
44                 }
45             }else{
46                 message = "用户名和密码不能为空";
47             }
48         }else{
49             message = "请先登录";
50         }
51     %>
52
53     <%
54         if(login){
55             %>
56                 <!-- 利用EL表达式获取存放在Session中的userInfo -->
57                 <p style="width:200px;height:200px;border:1px solid black;margin:100px auto;line-height:200px;text-align:center;">欢迎:<span>${userInfo.username}</span></p>
58             <%
59         }else{
60             %>
61                 <!-- 登录界面 -->
62                 <form action="<%=request.getRequestURI() "?" System.currentTimeMillis()%>" method="post">
63                     <table>
64                         <tr>
65                             <td colspan="2"><%=message %></td>
66                         </tr>
67                         <tr>
68                             <td align="right"><label for="name">用戶名:</label></td>
69                             <td><input type="text" name="username" id="name"></td>
70                         </tr>
71                         <tr>
72                             <td align="right"><label for="pwd">密码:</label></td>
73                             <td><input type="password" name="password" id="pwd"></td>
74                         </tr>
75                         <tr>
76                             <td colspan="2"><input type="submit" value="登录"></td>
77                         </tr>
78                     </table>
79                 </form>
80             <%
81         }
82     %>
83 </body>
84 </html>

下方图片就是服务端需要的Cookie,可以看到Cookie中存放了一个JSESSIONID:

二:有时候客户端不支持Cookie,或者说客户端禁用Cookie,这个时候可以使用URL重写的方式,添加JSESSIONID到URL中,一并发送到服务器:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>演示Session的使用</title>
 8 </head>
 9 <body>
10     <!-- 利用JSP的行为创建一个User实例 ,存放在默认的page域中-->
11     <jsp:useBean id="user" class="cn.woo.entity.User" scope="page"></jsp:useBean>
12     <jsp:setProperty property="username" name="user" value="woo"/>
13     <jsp:setProperty property="password" name="user" value="123456"/>
14
15     <%!
16         //定义要显示的错误提示信息
17         String message = "";
18         //登录标志
19         boolean login = false;
20     %>
21
22     <!-- 接收请求 -->
23     <%
24         System.out.println(request.getMethod());
25         if(request.getMethod().equalsIgnoreCase("post")){
26             request.setCharacterEncoding("utf-8");
27             response.setCharacterEncoding("utf-8");
28
29             //获取用户名和密码
30             String username = request.getParameter("username");
31             String password = request.getParameter("password");
32
33             //验证用户名和密码是否正确
34             if((username!=null && !username.isEmpty()) && (password!=null && !password.isEmpty())){
35                 if((username.equals(user.getUsername())) && (password.equals(user.getPassword()))){
36                     login = true;
37                     //设置Session的有效期,单位为s
38                     session.setMaxInactiveInterval(30*60);
39                     //利用Session记录用户信息
40                     session.setAttribute("userInfo",user);
41                     //重定向至该页面,添加参数,放置客户端缓存页面数据
42                     //response.sendRedirect(request.getRequestURI() "?" System.currentTimeMillis());
43                     //客户端不支持Cookie或者关闭Cookie的时候使用该方式进行URL的重写
44                     response.encodeRedirectURL(request.getRequestURI() "?" System.currentTimeMillis());
45                     return;
46                 }else{
47                     message = "用户名密码错误请重新登录";
48                 }
49             }else{
50                 message = "用户名和密码不能为空";
51             }
52         }else{
53             message = "请先登录";
54         }
55     %>
56
57     <%
58         if(login){
59             %>
60                 <!-- 利用EL表达式获取存放在Session中的userInfo -->
61                 <p style="width:200px;height:200px;border:1px solid black;margin:100px auto;line-height:200px;text-align:center;">欢迎:<span>${userInfo.username}</span></p>
62             <%
63         }else{
64             %>
65                 <!-- 登录界面 -->
66                 <!-- 客户端不支持Cookie或者关闭Cookie的时候使用该方式进行URL的重写
67                      response.encodeURL(request.getRequestURI() "?" System.currentTimeMillis())
68                 -->
69                 <form action="<%=response.encodeURL(request.getRequestURI() "?" System.currentTimeMillis()) %>" method="post">
70                     <table>
71                         <tr>
72                             <td colspan="2"><%=message %></td>
73                         </tr>
74                         <tr>
75                             <td align="right"><label for="name">用戶名:</label></td>
76                             <td><input type="text" name="username" id="name"></td>
77                         </tr>
78                         <tr>
79                             <td align="right"><label for="pwd">密码:</label></td>
80                             <td><input type="password" name="password" id="pwd"></td>
81                         </tr>
82                         <tr>
83                             <td colspan="2"><input type="submit" value="登录"></td>
84                         </tr>
85                     </table>
86                 </form>
87             <%
88         }
89     %>
90 </body>
91 </html>

点击登录的时候会清晰的看到URL的内容变化,中间包含jsessionid

http://localhost:8080/JSPDemo/session.jsp;jsessionid=D01238B61D0544108E0C04AA5E17EE6C?1534577455038

通常Cookie被禁用的方式很常见,所以一般都是禁用Cookie然后,直接同意采用URL重写的方式进行Session的使用:

【Session中禁用Cookie的方式】:

更多专业前端知识,请上 【猿2048】www.mk2048.com

会话跟踪之Session相关推荐

  1. java logout session_会话跟踪技术--session的使用

    会话跟踪技术--session的使用 会话跟踪: 1.使用隐藏表单字段 2.URL重写 http://host/path/file.jsp?sessionid=landril 3.持久Cookie 4 ...

  2. 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式

    解释HTTP HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否 ...

  3. 【Servlet】Session会话跟踪技术

    Session Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案. HttpSession对象是javax.servlet.http.Http ...

  4. JavaWeb第四讲 会话跟踪技术HttpSession、Cookie、url、隐藏表单域

    会话跟踪技术Session.Cookie.url.隐藏表单域 (一)Session session是保存在服务器端,理论上是没有是没有限制,只要你的内存够大. 浏览器第一次访问服务器时会创建一个ses ...

  5. 13.2.6 会话跟踪技术

    HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态. 但HTTP协议中可以使用Cookie来完成会话跟踪! 在Web开发中,使用session来完成会话跟踪,session ...

  6. java 4种跟踪会话技术_会话跟踪技术

    一.会话跟踪技术 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束. 在一个会话的多个请求中共享数据,这就是会话跟踪技术 会话路径技术使用Cookie ...

  7. [javaweb] servlet-session 会话跟踪技术 与 session保存作用域 (三)

    引入 Http是无状态的 -HTTP无状态︰服务器无法判断这两次请求是同一个客户端发过来的,还是不同的客户端发过来的 -无状态带来的现实问题∶第一次请求是添加商品到购物车,第二次请求是结账;如果这两次 ...

  8. java 会话跟踪技术_JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操作结果才能和登录用户做关联. 2.概念简介 可以把会话理解 ...

  9. JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...

最新文章

  1. 全国大学生智能汽车竞赛-讯飞赛道开始报名啦!
  2. break, continue, goto, return语句详解
  3. python画图代码星星-Python 星星 金字塔 学习笔记
  4. vant ui wepy_UI设计需要学习什么软件呢?
  5. java输入流的控制_Java-Android-IO流-控制台输入输出
  6. 清除Pycharm设置的方法
  7. 《延世大学韩国语教程2》第十九课 生病(下)
  8. python笔记(一)获取当前目录路径和文件(抄录)
  9. zabbix server is not running解决办法
  10. Windows 系统的默认字体是什么?应用的默认字体是什么?
  11. 《DirectX 9.0 3D游戏开发编程基础》-第一篇-VS2010下安装配置DirectX9 runtime和SDK
  12. 仿苹果响应式官网(含代码!)
  13. 最详细的工业网络通讯技术与协议总结解读(现场总线、工业以太网、工业无线)
  14. 【C++刷LeetCode套路1】Array题型: 双指针Two Pointers套路
  15. 程序员写代码也存在本手、妙手、俗手
  16. C# Aspose 操作Word书签
  17. 一组li或者div里面多个弹出层对应各自的内容
  18. 光源专家的8个打光技巧
  19. CSS 文本字体颜色设置方法。
  20. 英语文章书写规则总结

热门文章

  1. java integer valueof_对 Java Integer.valueOf() 的一些了解
  2. 一文一起,学习功能强大的Java8新StreamAPI,让集合的操作得心应手
  3. 第二章导数与微分思维导图_线性代数第二章 矩阵 思维导图
  4. uniapp 子组件 props拿不到数据_来吧!一文彻底搞定Vue组件!
  5. excel表格不够怎么添加_这个Excel表格,怎么做的这么漂亮
  6. c语言7.5return的值是,这个真心搞不懂了。求助
  7. P2863 [USACO06JAN]牛的舞会The Cow Prom
  8. boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域
  9. nginx_反向代理
  10. SharePoint 2013 workflow cannot start automatically when you logged in site as a system account