③、手工设置
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 页面
测试表单重复提交 用户名: 密码: 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("请不要重复请求!"); }}
推荐阅读
- 超简单雪人简笔画画法步骤
- 超人垃圾分类手抄报图文教程
- 美食饮品主题简笔画9款超萌咖啡简笔画
- 羡慕!选老公眼光超好的星座女
- 秋葵酿虾滑的做法
- word中的超链接怎么打不开怎么回事欢迎阅读
- 桃花超旺!三大星座5月不缺爱
- 超强的记忆里让你过目不忘不再总是狗熊掰棒子
- 越睡越困是怎么回事(睡觉超过1小时的危害)
- 超级勾魂营销文案模板,简单执行,日吸粉3000!