大家好,我是讯享网,大家多多关注。
点击关注快速晋级高级架构师。
作者:曾德
一、会话的概念
会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器。整个过程称为会话。
二、会话过程中要解决的一些问题
每个用户在使用浏览器与服务器对话的过程中,都不可避免地会产生一些数据,程序应该为每个用户找到保存这些数据的方法。
三、保存会话数据的两种技术
1、饼干
Cookie的意思是“曲奇”,是W3C提出的一种机制,最早由网景社区开发。目前cookie已经成为标准,IE、网景、火狐、Opera等主流浏览器都支持cookie。
因为HTTP是无状态协议,服务器无法从网络连接中知道客户端的身份。我该怎么办?给客户发个通行证就行了,一人一个,谁进去都要带自己的通行证。这样,服务器可以从通行证中确认客户的身份。这就是饼干工作原理。
Cookie实际上是一小段文本信息。请求客户机服务器,如果服务器需要记录用户的状态,使用response向客户机浏览器发出一个Cookie。客户端浏览器将保存Cookie。当浏览器再次请求网站时,浏览器将所请求的URL连同Cookie一起提交给服务器。服务器检查Cookie以识别用户状态。服务器也可以根据需要修改Cookie的内容。
2、会话
会话是一种服务器端技术。通过这项技术,服务器可以在运行时为每个用户的浏览器创建一个独占的会话对象。因为会话是用户浏览器专用的,所以用户可以在访问服务器的web资源时将数据放在自己的会话中。当用户访问服务器中的其他web资源时,其他web资源会从各自的会话中取出数据为用户服务。
四、Cookie类的主要方法
响应接口还定义了addCookie方法,该方法用于在其响应头中添加相应的Set-Cookie头字段。类似地,在请求接口中定义了一个getCookies方法,用于获取客户端提交的Cookie。
五、Cookie使用
1.使用cookie记录用户的上次访问时间。
第一次访问时,情况如下:
再次访问:
2.删除Cookie
3.从cookie中保存/检索中文
结果如下:
注意Cookie的细节
1.一个Cookie只能标识一种信息,它至少包含一个名称和设置值来标识信息。
2.一个网站可以向一个WEB浏览器发送多个cookie,一个WEB浏览器也可以存储多个网站提供的cookie。
3.一般来说,浏览器只允许存储300个Cookies。每个站点最多可以存储20个cookie,每个cookie的大小限制为4KB。
4.如果创建了一个cookie并发送给浏览器,默认情况下它是一个会话级cookie(即存储在浏览器的内存中),在用户退出浏览器后它会被删除。如果您希望浏览器将cookie存储在磁盘上,您需要使用maxAge并给出以秒为单位的时间。将最大时间限制设置为0会指示浏览器删除cookie。
六、Session简单介绍
在WEB开发中,服务器可以为每个用户的浏览器创建一个会话对象(session object)。注意:浏览器独占一个会话对象(默认情况下)。因此,当需要保存用户数据时,服务器程序可以将用户数据写入用户浏览器的独占会话中。当用户使用浏览器访问其他程序时,其他程序可以从用户的会话中取出用户的数据,为用户服务。
会话和Cookie之间的主要区别
1.Cookie是将用户的数据写入用户的浏览器。
2.会话技术将用户的数据写入用户的独占会话。
3.Session对象由服务器创建,开发者可以调用请求对象的getSession方法来获取Session对象。
七、Session基础知识
会话是一种服务器端技术。通过这项技术,服务器可以在运行时为每个用户的浏览器创建一个独占的会话对象。因为会话是用户浏览器专用的,所以用户可以在访问服务器的web资源时将数据放在自己的会话中。当用户访问服务器中的其他web资源时,其他web资源会从各自的会话中取出数据为用户服务。
当用户打开浏览器访问网站操作会话时,服务器会在服务器的内存中为浏览器分配一个会话对象,会话对象是浏览器专有的。
这个会话对象也可以看作是一个容器。会话的默认持续时间是30分钟,您可以修改它。
1.会话可以用来做什么?
1.网上商城中的购物车
2.保存登录用户的信息。
3.将同一用户的每个页面的一些数据放入会话中。
4.防止用户非法登录页面。
2.会话的基本用法
Servlet1:
Servlet2:
同一个浏览器访问Servlet1,然后访问Servlet2,结果如下:
不同的浏览器访问Servlet1,然后访问Servlet2,结果如下:
你可以看到此时名称为null,即没有从session对象中取出值,因为360浏览器并没有运行Servlet1来创建session对象,上面的Session对象是Chrome浏览器专有的。
3.会话生命周期
会话中属性的默认生存期是30分钟,可以通过修改web.xml文件来修改。
1、在Tomcat根目录下修改\conf\web.xml文件
& lt会话配置& gt& lt会话超时& gt30 & lt/session-time out & gt;& lt/session-config & gt;2.如果只需要为某个web应用设置,只需要修改对应web应用的web.xml文件即可。将上述代码添加到该web.xml文件中:
& lt会话配置& gt& lt会话超时& gt10 & lt/session-time out & gt;& lt/session-config & gt;除了设置默认的生命周期,最重要的是在程序中设置并调用setmaxinactiveinterval(int interval),其中间隔以秒为单位,这个方法设置发呆时间。例如,如果您将其设置为60秒,如果您在60秒内没有操作该会话,它将自动删除该会话。如果有,无论是设置还是读取属性,它都将从头开始计时。
session . setmaxinactiveinterval(60);八。会话实现原理服务器如何实现一个会话来服务一个用户的浏览器?
1.浏览器A首先访问Servlet1,此时它创建一个ID号为110的会话,然后Servlet1以Cookie的形式将这个ID号返回给浏览器A。
2.浏览器A继续访问Servlet2,那么这个请求会带来Cookie值:JSESSIONID=110,然后服务器会根据浏览器A传递的ID号在内存中找到这个会话。
3.浏览器B开始访问Servlet1,它的请求没有Cookie值JSESSIONID。由于它也需要使用Session,服务器将创建一个ID号为111的新会话。
4.浏览器B继续访问Servlet2,那么这个请求会带来Cookie值:JSESSIONID=111,然后服务器会根据浏览器B传递的ID号在内存中找到这个会话。
例如:
Servlet1:
Servlet2:
第一次访问Servlet1时,服务器会创建一个新的会话,并将会话的Id以cookie的形式发送给客户端浏览器,如下图所示:
如您所见,请求头中没有Cookie信息,但响应头中有这样一句话:
set-Cookie:JSESSIONID = 05a 94199 DDC 64311563740 cc 2c 78d 656;path =/CookieAndSession/;HttpOnly表示此时服务器通过Cookie将JSESSIONID属性传递回客户端。
然后访问Servlet2,如下图所示:
您可以看到Set-Cookie标头没有出现在响应标头中,但是Cookie标头出现在请求标头中:
Cookie:jssessionid = 05a 94199 DDC 64311563740 c 2c 78d 656,而这个头包含jssessionid,它的值就是我们之前的Set-Cookie中jssession id的值。
这就证明了之前举例说明的Session原理,即服务器可以针对不同浏览器区分不同会话的机制。
九、Session的简单应用
1.用户登录时验证验证码。
Index.jsp:
CodeServlet:
Web.xml:
这里用jelly-core-1.7.0.GA.jar生成一个验证码。如何使用它:
jelly-core-1 . 7 . 0 . ga . jar(http://www . blog Java . net/fancydeepin/archive/2014/08/03/jelly _ image . html)
访问http://localhost:8081/cookieandsession/index . JSP输入验证码,点击提交:
输入正确的验证码,页面将对结果做出响应:
输入错误验证码,页面响应如下:
输入正确的验证码,后台结果是:
输入错误验证码,后台结果:
2、实现简单的购物车
模拟数据库:
BuyBookServlet这个Servlet用于购买书籍:
运行结果:
3.防止用户非法登录页面。
比如我们的用户管理系统,只有登录成功后才能跳转到主页面,而不是直接绕过登录页面,进入主页面。这个应用程序非常常见。
当控制器LoginClServlet.java成功验证用户时,当前用户信息保存在会话对象中:
然后,在主页面的Main.java的开头,取出会话中登录用户的信息。如果信息是空,则是非法访问。直接跳转到登录页面,提示相关信息:
那么这里就有问题了。一个网站会有许多页面需要保护,防止非法访问。用这种方法不会很麻烦吗?
两种解决方案:
第一种方法是将这段验证用户的代码封装到一个函数中,每次都会调用这个函数。
第二:使用过滤器。
4.使用会话来防止重复提交表单
具体做法:
在服务器端生成一个唯一的随机标识号,技术上叫做Token,将这个Token保存在当前用户的会话域中。然后,令牌被发送到客户端的表单,表单使用隐藏字段来存储令牌。当表单被提交时,它与令牌一起被提交到服务器端。然后,服务器端判断客户端提交的令牌与服务器端生成的令牌是否一致。如果不是,则为重复提交,服务器端无法处理重复提交。如果相同,将处理表单提交,处理后将清除当前用户的会话域中存储的标识号。
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
1.存储的会话域中的令牌不同于表单提交的令牌。
2.当前用户的会话中不存在令牌。
3.用户提交的表单数据中没有令牌。
例如:
创建FormTokenServlet,用于生成令牌并跳转到token.jsp页面:
使用隐藏域在Token.jsp存储令牌,并将令牌提交给服务器:
TokenServlet处理表单提交:
运行结果如下:
十、用户禁用Cookie后的Session处理
这里有个情况。如果用户的浏览器禁用了Cookie怎么办?例如,我禁用了Chrome的Cookie,如下所示:
解决方法:URL重写
Servlet中的响应提供了重写URL的方法:
那么URL重写是什么意思呢?其实就是人为的给url附加JSESSIONID。例如,当我们修改之前编写的简单购物车时,ShowBook中所有的点击购买超链接都必须重写。
这是我们之前写的:
out . println(” & lt;tr & gt& ltTD >;+book . getname()+” & lt;/TD & gt;& lttd & gt& lta href = ‘ “+req . getcontextpath()+”/buybookservlet . html?id = “+book . getid()+” ‘ & gt;单击购买;);现在重写URL:
req . getsession();String url = “/MyCart/BuyBookCl?id = “+book . getid();URL = resp . encode URL(URL);out . println(” & lt;tr & gt& ltTD >;+book . getname()+” & lt;/TD & gt;& lttd & gt& lta href = ‘ “+URL+” ‘ & gt;单击购买;);请注意,在重写之前,必须调用或使用request.getSession()方法。
重写之前,访问ShowBookServlet的源代码是这样的:
重写后:
可以看到,url被重写后,参数jSessionid被自动附加到URL上,从而保证了即使Cookie被禁用,我们的会话也能继续正常使用。此时,当我们如下图查看购物车的地址栏时,可以清楚地看到参数jsessionid:
原文:https://www.cnblogs.com/Zender/p/7657516.html
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/32633.html