会话跟踪之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,一经查实,立即删除!

相关文章

linux 认证考试 题库,Linux认证考试题库及答案

1、一个文件的权限是-rw-rw-r--&#xff0c;这个文件所有者的权限是什么()a、read-onlyb、read-writec、write答案 b2、下面哪个值代表多用户启动()a、1b、0c、3d、5答案 c3、下面哪个文件代表系统初始化信息()a、/etc/inittabb、/etc/initc、/etc/procd、/etc/initproc答案 a4…

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

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

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

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

第五天

21&#xff0c;Tomcat如何修改端口号&#xff0c;如何清除项目缓存&#xff0c;默认并发量是多少&#xff1f; 端口&#xff1a;conf/server.xml 项目缓存&#xff1a;删除work文件夹下的文件 并发&#xff1a;150-200 22&#xff0c;final、finally、finalize的区别&#xff1…

websocket的加密和解密

补充个小知识点&#xff1a;按位与运算 按位与运算是同位都为1才为1&#xff0c;有一个不为1就是0 websocket_hand 1 import socket, base64, hashlib2 import websocket_jiemi3 import websocket_jiami4 5 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)6 sock.se…

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

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

linux c 指针数组定义数组长度,C/C++指针数组和 迪士尼源码搭建下载 数组指针...

迪士尼源码搭建下载【指针数组 : 存放指针的数组其定义抽象为&#xff1a;指向变量的类型 * 数组名称 [数组长度]。int *p[2];p[0] NULL;p[1] NULL;2. 数组指针 : 指向数组的指针2.0 定义抽象&#xff1a;数组元素类型 (* 指针名称)[数组长度].2.1 假设数组int a[2][2] { {1…

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

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

tp5 修改默认的分页url

默认分页url&#xff1a;xx.com/xxx?page1 个人主要感觉不美观&#xff0c;想变成xx.com/xxx/list_1.html这样的 框架本身默认使用的boostrap分页类&#xff0c;目录位置 simplewind\thinkphp\library\think\paginator\driver\Bootstrap.php 调用url的主要是父类Paginator的ur…

多路复用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…

re正则表达式公式讲解5

1.refullmatch() 完全匹配字符串则返回object&#xff0c;否则返回None import res "max123uyt146"print(re.fullmatch("\w \w ",s))# <_sre.SRE_Match object; span(0, 13), matchmax123uyt146>2.re.compile() 两种方法返回的同一个对象&#x…

P1880 [NOI1995]石子合并

\(\color{#0066ff}{ 题目描述 }\) 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.…

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

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

python执行linux和window的命令

linux&#xff1a; python执行shell脚本常用的方法 import os valos.system("shell语句") >>> valos.system("more /tmp/web.access.log |grep 222.132.79.77 -wc")826>>> print val0 valos.popen("shell语句").read() val可…

外部服务的集成测试

我们的系统通常依赖于第三方服务&#xff08;它们甚至可能是我们无法控制的公司内部服务&#xff09;。 此类服务包括公开API的社交网络&#xff0c;带有诸如Salesforce&#xff0c;身份验证提供程序之类的API的SaaS或我们系统与之通信但不在产品生命周期内的任何系统。 在常规…

自定义控件中使用Render的writer

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