session 简介
session 是我们 jsp 九大隐含工具的一个工具。
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(60*60*24);//秒为单元 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 重写
今年本命年要注意什么,带你揭秘2020年本命年四大禁忌
在整个会话控制手艺系统中,保持 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 机制来防止重复提交
本文来源于自互联网,不代表n5网立场,侵删。发布者:虚拟资源中心,转载请注明出处:https://www.n5w.com/233787.html