会话跟踪之Session

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在NIO.2中创建文件和目录

如今&#xff0c;大量的应用程序创建文件或目录的目的非常广泛。 无论是生成报告&#xff0c;导出配置文件还是仅存储一些数据&#xff0c;能够处理这些任务都非常重要。 创建文件和目录是使用文件系统时最常用的功能之一。 图书馆的这一部分进行了相当现代化。 这方面的更新包…

实现flash的图片切换效果【可以切换多个网页或者图片】

这个是得到改进后的代码&#xff0c;可以切换多个页面 需要完整代码的朋友可以留下email如需再添加切换页面&#xff0c;只要按照下边代码部分的样式添加内容即可切换导航td的id要顺序排那个div的TOP为为上边一个div的Top加上div本身的高度&#xff1a;2371<% Page Language…

《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解

上一篇我们详细解释了一下SrpingMVC的执行流程以及一些默认的配置&#xff0c;在Spring的思想中&#xff0c;就是默认大于配置。今天我们来详细的研究一下DispatcherServlet的url-pattern配置。 一、DispatcherServlet的url-pattern配置在没有特别要求的情况下&#xff0c;Spri…

vc中怎么使用SendMessage自定义消息函数

vc中怎么使用SendMessage自定义消息函数&#xff1a; SendMessage的基本结构如下&#xff1a; SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄。 UINT Msg, //消息类别&#xff08;这里可以是一些系统消息&#xff0c;也可以是自己定义&#xff0c;下文具…

多路复用IO和异步IO

多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket&#xff0c;当某个socket有数据到达了&#xff0c;就通知用户进程。 流程图如下&#xff1a; 当用户进程调用了select&#xff0c;那么整个进程会被block&#xff0c;而同时&#xff0c…

Java开发人员应该知道的7种新工具

通过快速浏览一些最新的创新工具&#xff0c;随时准备锁定和加载。 万一您错过了它&#xff0c;RebelLabs最近发布了Java工具和技术前景的全球调查结果 。 除了著名的工具和成熟的工具外&#xff0c;市场还涌现出鲜有人知的新鲜工具和框架。 在这篇文章中&#xff0c;我决定收集…

leetcode-92-反转链表②

题目描述&#xff1a; 方法一: class Solution:def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:dummy ListNode(0)dummy.next headpre dummyfor i in range(m-1):pre pre.nextstart pre.nexttrail start.nextfor i in range(n-m):start.next …

linux 7 services设定,CENTOS/RHEL7系统中设置SYSTEMD SERVICE的ULIMIT资源限制

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;在bash中&#xff0c;有个ulimit命令&#xff0c;提供了对shell及该shell启动的进程的可用资源控制。主要包括打开文档描述符数量、用户的最大进程数量、coredump文…

ON_COMMAND_RANGE用法

afx_msg voidOnOutPutStatusButtonUp (WPARAM wParam, LPARAM lParam);BEGIN_MESSAGE_MAP(CIOStatue, CDialog)//{{AFX_MSG_MAP(CIOStatue)//}}AFX_MSG_MAPON_COMMAND_RANGE(IDC_STATIC_OUT1,IDC_STATIC_OUT16,OnOutPutStatusButtonUp)END_MESSAGE_MAP()//注意IDC_STATIC_OUT1…

在c语言中a 这条语句的作用,C语言复习第二章

C语言第二章C语言复习(第二章)一、填空1、若采用十进制数的表示形式&#xff0c;则077为( )&#xff0c;0111为( )&#xff0c;0xab为( )。 2、C语言中的标识符只能由3种字符组成&#xff0c;它们是( )、( )和( )。 3、在C语言中&#xff0c;用“\\”开头的字符序列称为转义字符…

自定义控件中使用Render的writer

给自定义控件一个模板并输出&#xff0c;可以在重写控件的Render&#xff0c;并使用它的HtmlTextWriter writer例如&#xff1a;publicclassMyTextBox : TextBox { private string _template"<tr><td> {0} </td><td> {1} </td>&l…

【ABAP系列】SAP 面试 ABAPer的一些感想

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【ABAP系列】SAP 面试 ABAPer的一些感想前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版更好&#xff0c;阅读更舒适。 …

mean技术栈 linux,“MEAN”技术栈开发web应用

var express require(express);var app express();app.listen(3000);var _rootDir __dirname;var protectDir _rootDir /protect/;app.use(express.static(_rootDir));//注册路由app.get(/, function(req, res){res.sendFile(_rootDir/src/index.html);});app.use(functio…

仔细研究Java Identity API

在深入探讨之前&#xff0c;让我们看一下有关Java Identity API JSR 351的一些快速事实。 这仍在进行中。 。 。 JSR是什么时候发起的&#xff1f; 该JSR在2011年10月通过了批准投票&#xff0c;随后在2011年11月成立了专家组。 谁负责此规范&#xff1f; Java Identity AP…

c语言按shift用户随时退出,2014年云南省“三校生”高考计算机第三次模拟试卷...

密班级&#xff1a; 姓名&#xff1a; 学号&#xff1a;密 封 线 内 不 得 答 题玉龙职高2012年高考第三次模拟试卷计算机基础总分&#xff1a;150分&#xff0c;考试时间&#xff1a;120分钟。一、单项选择题(在每小题给出的四个选项中&#xff0c;只有一个是符合题目要求的&a…

无状态EJB:池化和生命周期

无状态EJB池和生命周期的摘要视图&#xff08;注释&#xff09;。 对新手有用。 。 。 。 。 EJB池&#xff1a;快速概述 EJB实例存储在称为EJB池的位置–这不过是内存中的缓存 。 无状态EJB通常按需实例化&#xff0c;即&#xff0c;当客户端调用Bean上的方法时。 但是&…

代码整洁之道——有意义的命名(持续更新中)

我们给变量、参数、类、包&#xff0c;源代码和源代码所在目录命名&#xff0c;也给jar文件、war文件和ear文件命名。 We name variables, parameters, classes, packages, source code, and the directory where the source code resides, as well as jar files, war files, a…

fixed 语句(C# 参考)

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。 备注 fixed 语句设置指向托管变量的指针并在 statement 执行期间“钉住”该变量。如果没有 fixed 语句&#xff0c;则指向可移动托管变量的指针的作…

React Antd中样式的修改

如果需要对antd的样式进行修改&#xff0c; 进入你要修改的页面 注意&#xff1a;不能直接在自己的文件下面&#xff0c;加入一个css&#xff0c;修改这个class的样式&#xff0c;应该 加入global限定&#xff0c;global {} , 在{}里面写入 .classname {} 然后在设置css样式…

【Python】贪心算法入门

一.引言 本文将通过两个问题和两道例题带你入门贪心算法。 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最优&#xff08;最好或最有利&#xff09;的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法不保证找到全局最优…