Session的活化和钝化,表单重复提交,验证码使用流程
钝化
指将HttpSession对象序列化到硬盘中,一般钝化发生在服务器停止,服务器停止时会自动将HttpSession对象序列化到硬盘,这个事我们称为钝化。
活化
将硬盘中HttpSession对象加载进内存中,一般在服务器启动时,会自动将硬盘中HttpSession对象重新加载进内存,这一过程我们成为活化。
钝化指将内存中的对象写到硬盘中,
一个类要想可以序列化到硬盘中必须要实现java.io.Serializable接口
这个类中的所有属性也需要实现java.io.Serializable接口
如果服务器的访问量较大,那么服务器会有大量的HttpSession对象存在,
但是这些对象并不是都处于一个活跃的状态,但是这些不活跃也会存在于内存中
这样会大量占用内存,这时我们就希望将这些闲置的对象写入硬盘中,在用户需要使用session在加载进内存。
在context.xml文件中可以加入如下内容
maxIdleSwap:指session的最大闲置时间,超过该时间以后,session将会自动钝化。
directory:钝化到硬盘中的目录
session会钝化到tomcat服务器的work目录中
表单的重复提交
表单重复提交指的是同一个表单相同的内容多次提交请求
表单重复提交的危害:
1.表单重复提交,都是重复的数据,会增加数据库中垃圾数据。
2.无形中增加了服务器压力。
表单重复提交的几种情况:
1.表单提交成功以后,反复刷新成功页面。
产生问题的根本原因:
我们在Servlet使用的转发的形式跳转到成功页面的,所以整个过程中浏览器只发送了一次请求,当我们在成功页面刷新时,实际是将上次的请求又发送了一遍,所以造成了重复提交。
解决:
不使用转发,而是使用重定向
重定向发了两次请求,我们再次刷新,刷新的第二个请求,而不是第一个。
2.网速较慢时,用户多次点击提交按钮。
产生问题的根本原因:
就是表单的提交按钮可以点击多次
解决:
使表单的提交按钮只能点一次,点完一次以后按钮将变为不可用的状态。
_window.onload = function(){
//点击完提交按钮以后,让按钮变为一个不可用的状态
//获取按钮对象
var btn = document.getElementById("btn");
//为按钮绑定一个单击响应函数
btn.onclick = function(){
//设置按钮为不可用状态
this.disabled = true;
//如果将按钮设置为不用状态,那么表单也将不会提交
//我们需要手动提交表单
this[xss_clean].submit();
};
};
3.成功提交请求后,点击回退按钮,但是不刷新页面,再次提交。
产生问题的根本原因:
服务器端的Servlet不能区分两次请求是不是重复提交的内容
解决:
在Servlet中,我们需要在处理请求之前,先来检查表单是否是重复提交。
使用token解决这个问题
token就是令牌意思
所谓的token就是服务器在处理用户请求之前,先检查token是否正确,如果token正确那服务器正常处理请求,如果token不正确服务器不处理请求.
我们的令牌是一个一次性的令牌,只能使用一次.
流程:
1.创建一个令牌,要求唯一,不能重复(UUID),并在服务器中保存token。
2.放入到浏览器的表单中。
3.浏览器提交表单时,会同时将token一起提交。
4.服务器在处理请求之前要检查令牌是否有效。
5.销毁token。
验证码使用流程
上述工作,大部分工作我们都可以通过一款jar包来完成。
kaptcha-2.3.2
该Jar可以:
1.可以生成一个随机的字符串
2.可以将字符串保存到session
3.可以将字符串转换为一个图片
这个kaptcha-2.3.2里边实际上就是一个Servlet,我们通过访问他给我们提供的Servlet,就可以直接完成上述工作
导入jar包之后,通过在web.xml文件中注册servelt即可。
< servlet> < servlet-name >kaptcha servlet-name>com.google.code.kaptcha.servlet.KaptchaServlet //在session中存储该验证码的属性的名字 kaptcha.session.key code param-value> kaptcha servlet-name> /code.jpg url-pattern>