作者:Zender
一、会话的观点会话可大略理解为:用户开一个浏览器,点击多个超链接,访问做事器多个web资源,然后关闭浏览器,全体过程称之为一个会话。
二、会话过程中要办理的一些问题每个用户在利用浏览器与做事器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
三、保存会话数据的两种技能
1、Cookie
Cookie意为\公众甜饼\"大众,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,做事器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通畅证吧,每人一个,无论谁访问都必须携带自己通畅证。这样做事器就能从通畅证上确认客户身份了。这便是Cookie的事情事理。
Cookie实际上是一小段的文本信息。客户端要求做事器,如果做事器须要记录该用户状态,就利用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再要求该网站时,浏览器把要求的网址连同该Cookie一同提交给做事器。做事器检讨该Cookie,以此来辨认用户状态。做事器还可以根据须要修正Cookie的内容。
2、session
Session是做事器端技能,利用这个技能,做事器在运行时可以为每一个用户的浏览器创建一个其独享的session工具,由于session为用户浏览器独享,以是用户在访问做事器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问做事器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户做事。
四、Cookie类的紧张方法response接口也中定义了一个addCookie方法,它用于在其相应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。
五、Cookie利用1、利用cookie记录用户上一次访问的韶光
第一次访问时,如下所示:
再次访问:
2、删除Cookie
3、cookie中存/取中文
结果如下:
Cookie把稳细节
1,一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
2,一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点供应的Cookie。
3,浏览器一样平常只许可存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限定为4KB。
4,如果创建了一个cookie,并将他发送到浏览器,默认情形下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则须要利用maxAge,并给出一个以秒为单位的韶光。将最大时效设为0则是命令浏览器删除该cookie。
六、Session大略先容在WEB开拓中,做事器可以为每个用户浏览器创建一个会话工具(session工具),把稳:一个浏览器独占一个session工具(默认情形下)。因此,在须要保存用户数据时,做事器程序可以把用户数据写到用户浏览器独占的session中,当用户利用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户做事。
Session和Cookie的紧张差异
1,Cookie是把用户的数据写给用户的浏览器。
2,Session技能把用户的数据写到用户独占的session中。
3,Session工具由做事器创建,开拓职员可以调用request工具的getSession方法得到session工具。
七、Session根本知识Session是做事器端技能,利用这个技能,做事器在运行时可以为每一个用户的浏览器创建一个其独享的session工具,由于session为用户浏览器独享,以是用户在访问做事器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问做事器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户做事。
当用户打开浏览器,访问某个网站操作session时,做事器就会在做事器的内存为该浏览器分配一个session工具,该session工具被这个浏览器独占。
这个session工具也可以看做是一个容器,session默认存在韶光为30min,你可以修正。
1、Session可以用来做什么
1、网上商城中的购物车
2、保存登任命户的信息
3、将某些数据放入到Session中,供同一用户的各个页面利用
4、防止用户造孽登录到某个页面。
2、Session基本利用
Servlet1:
Servlet2:
同一浏览器访问Servlet1,再访问Servlet2,结果如下:
不同浏览器访问Servlet1,再访问Servlet2,结果如下:
可以看到这时候name是null,也便是没有从session工具中取出值,由于360浏览器并没有运行Servlet1来创建Session工具,上面的session工具是Chrome浏览器独占的。
3、Session生命周期
Session中的属性的默认生命周期是30min,这个默认韶光可以通过修正web.xml文件来修正
1,在Tomcat根目录\conf\web.xml文件中修正
<session-config> <session-timeout>30</session-timeout></session-config>
2,如果只须要对某一个web运用设置,则只须要修正对应web运用的web.xml文件。在这个web.xml文件中添加如上的代码:
<session-config> <session-timeout>10</session-timeout></session-config>
除了设置默认生命周期之外,最主要的是在程序中设置,调用setMaxInacttiveInterval(int interval),这里的interval因此秒为单位的,而且这个方法设置的是发呆韶光,比如你设置的是60秒,那么在这60秒之内如果你没有操作过session,它就会自动删除,如果你操作过,不管是设置属性还是读取属性,它都会从头开始计时。
session.setMaxInactiveInterval(60);八、Session实现事理
做事器是如何实现一个session为一个用户浏览器做事的?
1,浏览器A先访问Servlet1,这时候它创建了一个Session,ID号为110,然后Servlet1将这个ID号以Cookie的办法返回给浏览器A。
2,浏览器A连续访问Servlet2,那么这个要求会带上Cookie值: JSESSIONID=110,然后做事器根据浏览器A通报过来的ID号找到内存中的这个Session。
3,浏览器B来访问Servlet1了,它的要求并没有带上 JSESSIONID这个Cookie值,由于它也要利用Session,以是做事器会新创建一个Session,ID号为111。
4,浏览器B连续访问Servlet2,那么这个要求会带上Cookie值: JSESSIONID=111,然后做事器根据浏览器B通报过来的ID号找到内存中的这个Session。
例如:
Servlet1:
Servlet2:
第一次访问Servlet1时,做事器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器,如下图所示:
可以看到,Request Headers中并没有Cookie的信息,而Response Headers中有这么一句话:
Set-Cookie:JSESSIONID=05A94199DDC64311563740CC2C78D656; Path=/CookieAndSession/; HttpOnly
解释这个时候做事器向客户端通过Cookie通报回了 JSESSIONID这个属性。
然后访问Servlet2,如下图所示:
可以看到Response Headers中没有涌现Set-Cookie这个头,而Request Headers中带上了Cookie这个头:
Cookie:JSESSIONID=05A94199DDC64311563740CC2C78D656
而这个头中正包含 JSESSIONID,并且它的值也便是我们之前Set-Cookie中 JSESSIONID的值。
这就证明了我们之前图解的Session的事理,也便是做事器能够为不同的浏览器区分不同的Session的机制。
九、Session的大略运用1,用户登录时候验证验证码
Index.jsp:
CodeServlet:
Web.xml:
这里利用了jelly-core-1.7.0.GA.jar来天生了验证码,详细利用办法:
jelly-core-1.7.0.GA.jar(http://www.blogjava.net/fancydeepin/archive/2014/08/03/jelly_image.html)
访问http://localhost:8081/CookieAndSession/index.jsp输入验证码,点击提交:
输入精确验证码,页面相应结果:
输入缺点验证码,页面相应结果:
输入精确验证码,后台结果:
输入缺点验证码,后台结果:
2,实现大略单纯购物车
仿照一个数据库:
BuyBookServlet这个Servlet用于购买图书:
运行结果:
3,防止用户造孽登录到某个页面
比如我们的用户管理系统,必须要登录成功后才能跳转到主页面,而不能直接绕过登录页面直接到主页面,这个运用是一个非常常见的运用。
当在验证用户的掌握器LoginClServlet.java验证用户成功后,将当前的用户信息保存在Session工具中:
然后在主页面Main.java最开始的地方,取出Session中的登任命户信息,如果信息为空,则为造孽访问,直接跳转到登录页面,并提示干系信息:
那么这里就存在一个问题,一个网站会有很多个须要防止造孽访问的页面,如果都是用这种方法岂不是很麻烦?
两种办理办法:
第一种:将这段验证用户的代码封装成函数,每次调用
第二种:利用过滤器
4,利用Session防止表单重复提交
详细的做法:
在做事器端天生一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户真个Form表单中,在Form表单中利用隐蔽域来存储这个Token,表单提交的时候连同这个Token一起提交到做事器端,然后在做事器端判断客户端提交上来的Token与做事器端天生的Token是否同等,如果不一致,那便是重复提交了,此时做事器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后打消当前用户的Session域中存储的标识号。
不才列情形下,做事器程序将谢绝处理用户提交的表单要求:
1,存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
2,当前用户的Session中不存在Token(令牌)。
3,用户提交的表单数据中没有Token(令牌)。
例如:
创建FormTokenServlet,用于天生Token和跳转到token.jsp页面:
在token.jsp中利用隐蔽域来存储Token(令牌),提交Token(令牌)到做事器:
TokenServlet处理表单提交:
运行结果如下:
十、用户禁用Cookie后的Session处理
这里存在一种情形,如果用户浏览器禁用了Cookie怎么办?比如我把Chrome的Cookie禁用,如下:
办理方法:URL重写
Servlet中的response供应了对URL重写的方法:
那么URL重写是什么意思呢?实在便是人为地把JSESSIONID附在了url的后面,比如我们修正之前写的大略单纯购物车,ShowBook中所有的点击购买超链接都要重写。
之前我们是这么写的:
out.println(\公众<tr><td>\公众+book.getName()+\"大众</td><td><a href='\"大众+ req.getContextPath() +\"大众/BuyBookServlet.html?id=\"大众+book.getId()+\公众'>点击购买</a></td></tr>\"大众);
现在进行URL重写:
req.getSession();String url = \"大众/MyCart/BuyBookCl?id=\"大众+book.getId();url = resp.encodeURL(url);out.println(\公众<tr><td>\"大众+book.getName()+\"大众</td><td><a href='\"大众+url+\"大众'>点击购买</a></td></tr>\"大众);
须要把稳的是,重写之前一定要调用或者确保利用过request.getSession()这个方法。
重写之前,访问ShowBookServlet的源代码是这样的:
重写之后呢:
可以看到URL重写之后,jsessionid这个参数自动附在了url后面,由此,得以确保我们的Session在Cookie被禁用的情形下连续正常利用。这时候我们查看购物车的地址栏如下,可以明显看到jsessionid这个参数:
原文:https://www.cnblogs.com/Zender/p/7657516.html