session 称作域工具,他的浸染是保存一些信息,而 session 这个域工具是一次会话期间利用同一个工具。以是这个工具可以用来保存共享数据。
利用 Cookie 有一个非常大的局限,便是如果 Cookie 很多,则无形的增加了客户端与做事真个数据传输量。而且由于浏览器对 Cookie 数量的限定,注定我们不能再 Cookie 中保存过多的信息,于是 Session 涌现。Session 的浸染便是在做事器端保存一些用户的数据,然后通报给用户一个名字为JSESSIONID 的 Cookie,这个 JESSIONID 对应这个做事器中的一个 Session 工具,通过它就可以获取到保存用户信息的 Session。session 是基于 cookie 的。
在用户第一次利用 session 的时候(访问 jsp 页面会获取 session,以是一样平常访问 index.jsp 就算是第一次利用 session 了),做事器会为用户创建一个 session 域工具。利用jsessionid 和这个工具关联,这个工具在全体用户会话期间利用。相应体增加 set-cookie:jsessionid=xxx 的项。用户下次往后的要求都会携带 jsessionid 这个参数,我们利用request.getSession()的时候,就会利用 jsessionid 取出 session 工具。
session 事理图:
回到顶部
HttpSession 的生命周期
什么时候创建 HttpSession 工具
①. 对付 JSP: 是否浏览器访问做事真个任何一个 JSP, 做事器都会立即创建一个 HttpSession 工具呢?
不一定。
若当前的 JSP 是客户端访问确当前 WEB 运用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false,则做事器就不会为 JSP 创建一个 HttpSession 工具;若当前 JSP 不是客户端访问确当前 WEB 运用的第一个资源,且其他页面已经创建一个 HttpSession 工具,则做事器也不会为当前 JSP 页面创建一个 HttpSession 工具,而会把和当前会话关联的那个 HttpSession 工具返回给当前的 JSP 页面.②. 对付 Serlvet: 若 Serlvet 是客户端访问的第一个 WEB 运用的资源,则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HttpSession 工具
page 指令的 session=“false“ 表示什么意思?
当前 JSP 页面禁用 session 隐含变量!
但可以利用其他的显式的 HttpSession 工具
在 Serlvet 中如何获取 HttpSession 工具?
request.getSession(boolean create):
create 为 false, 若没有和当前 JSP 页面关联的 HttpSession 工具, 则返回 null; 若有, 则返回 true
create 为 true, 一定返回一个 HttpSession 工具. 若没有和当前 JSP 页面关联的 HttpSession 工具, 则做事器创建一个新的HttpSession 工具返回, 若有, 直接返回关联的.
request.getSession(): 等同于 request.getSession(true)
什么时候销毁 HttpSession 工具
①. 直接调用 HttpSession 的 invalidate() 方法: 该方法使 HttpSession 失落效
②. 做事器卸载了当前 WEB 运用.
③. 超出 HttpSession 的过期韶光.
④. 并不是关闭了浏览器就销毁了 HttpSession.
回到顶部
session 利用
获取 session 工具
HttpSession session = request.getSession();
session 是我们的四大域工具之一。用来保存数据。常用的方法
session.setAttribute(\公众user\公众, new Object()); session.getAttribute(\"大众user\"大众);session.setMaxInactiveInterval(606024);//秒为单位session.invalidate();//使 session 不可用
Session 时 效
①、基本原则
Session 工具在做事器端不能长期保存,它是有韶光限定的,超过一定韶光没有被访问过的 Session 工具就该当开释掉,以节约内存。以是 Session 的有效韶光并不是从创建工具开始计时,到指定时间后开释——而是从末了一次被访问开始计时,统计其“空闲” 的韶光。
②、默认设置
在全局 web.xml 中能够找到如下配置:
<session-config> <session-timeout>30</session-timeout></session-config>
③、手工设置
session.setMaxInactiveInterval(int seconds) session.getMaxInactiveInterval()
④、逼迫失落效
session.invalidate()
⑤、可以使 Session 工具开释的情形
Session 工具空闲韶光达到了目标设置的最大值,自动开释
Session 工具被逼迫失落效
Web 运用卸载做事器进程停滞
URL 重写
在全体会话掌握技能体系中,保持 JSESSIONID 的值紧张通过 Cookie 实现。但 Cookie 在浏览器端可能会被禁用,以是我们还须要一些备用的技能手段,例如:URL 重写。
1)URL 重写实在便是将 JSESSIONID 的值以固定格式附着在 URL 地址后面,以实现保持
JSESSIONID,进而保持会话状态。这个固定格式是:URL;jsessionid=xxxxxxxxx
例如:
targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957
2) 实 现 方 式 :
response.encodeURL(String)response.encodeRedirectURL(String)
例如:
//1.获取Session工具HttpSession session = request.getSession();//2.创建目标URL地址字符串String url = \"大众targetServlet\公众;//3.在目标URL地址字符串后面附加JSESSIONID的值url = response.encodeURL(url);//4.重定向到目标资源response.sendRedirect(url);
Session 的活化和钝化
Session 机制很好的办理了 Cookie 的不敷,但是当访问运用的用户很多时,做事器上就会创建非常多的 Session 工具,如果不对这些 Session 工具进行处理,那么在 Session 失落效之前,这些 Session 一贯都会在做事器的内存中存在。那么就,就涌现了 Session 活化和钝化的机制。
1)Session 钝化:
Session 在一段韶光内没有被利用时,会将当前存在的 Session 工具序列化到磁盘上,而不 再 占 用 内 存 空 间 。
2)Session 活化:
Session 被钝化后,做事器再次调用 Session 工具时,将 Session 工具由磁盘中加载到内存中利用。
如果希望 Session 域中的工具也能够随 Session 钝化过程一起序列化到磁盘上,则工具的实现类也必须实现 java.io.Serializable 接口。不仅如此,如果工具中还包含其他工具的引用,则被关联的工具也必须支持序列化,否则会抛出非常:java.io.NotSerializableException
回到顶部
表单重复提交问题
什么是表单重复提交?
同一个表单中的数据内容多次提交到做事器。 危害:
做事看重复处理信息,包袱加重。
如果是保存数据可能导致保存多份相同数据。
推举博客
程序员写代码之外,如何再赚一份人为?
几种重复提交
1)提交完表单后,直接刷新页面,会再次提交。
- 根本缘故原由:Servlet 处理完要求往后,直接转发到目标页面。
- 这样整一个业务,只发送了一次要求,那么当你在浏览器中点击刷新按钮或者狂按 f5,会一贯都会刷新之前的要求
办理方案:利用重定向跳转到目标页面
2)提交表单后,由于网速差等缘故原由,做事器还未返回结果,连续点击提交按钮,会重 复提交。
- 根本缘故原由:按钮可以多次点击
- 办理方案:通过 js,使得按钮只能提交一次。
$(“#form1”).submit(function(){ $(“#sub_btn”).prop(“disabled”,true);})
3)表单提交后,点击浏览器回退按钮,不刷新页面,点击提交按钮再次提交表单
- 根本缘故原由:做事器并不能识别要求是否重复。
- 办理方案:利用 token 机制。
1、页面天生时,产生一个唯一的 token 值。将此值放入 session
2、表单提交时,带上这个 token 值。
3、做事端验证 token 值存在,则提交表单,然后移除此值。验证 token 不存在,解释是之前验证过一次被移除了,所以是重复要求。不予处理
事理:
代码:
jsp 页面
<% String token = System.currentTimeMillis() + \"大众\"大众; request.getSession().setAttribute(token, \"大众\"大众);%><div> <h1>测试表单重复提交</h1> <form action=\"大众login\"大众 method=\公众get\"大众> 用户名:<input name=\"大众username\"大众 type=\"大众text\公众/> 密码:<input name=\公众password\"大众 type=\"大众password\公众> <input name=\"大众token\"大众 value=\"大众<%=token%>\"大众> <input type=\"大众submit\"大众> </form> <hr></div>
Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String token = request.getParameter(\"大众token\公众); Object attribute = session.getAttribute(token); response.setContentType(\公众text/html;charset=UTF-8\公众); if(attribute!=null){ session.removeAttribute(token); response.getWriter().write(\"大众要求成功!
\公众); }else{ response.getWriter().write(\"大众请不要重复要求!
\"大众); }}
实在防止重复提交的核心便是让做事器有一个字段能来识别这次要求是否已经实行。 这个字段须要页面通报过来,由于只要回退回去的页面,字段都是同等的。不会变革, 通过这个特性我们想到了 token 机制来防止重复提交
欢迎事情一到五年的Java工程师朋友们加入Java程序员开拓: 721575865
群内供应免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的韶光来学习提升自己,不要再用\"大众没有韶光“来掩饰笼罩自己思想上的