社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
当我们注册完用户后,跳转去注册成功页面。我们按下F5 刷新页面。这时候页面会提示我们是不是要重复提交表单。这个时候,如果我们点击【继续】。表单又会重新请求一次。这样我们的网站的健壮性就不够好。
表单重复提交有三个原因:
解决方案一:使用重定向
response.sendRedirect(); 使用重定向跳转。(仅仅可以解决问题1)
解决方案二:推荐使用token防止表单重复提交 (可以解决所有问题)
token的使用需要分两步:
第一步:在表单页面端使用代码生成一个验证码存放到Session对象中
<body>
<h1>用户注册</h1>
<table>
<form action="userServlet" method="post">
<tr>
<td>用户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>验证码:</td>
<td><input type="text" name="code" /><img alt="" width="100" height="30" src="kaptchaServlet"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注册"/></td>
</tr>
</form>
</table>
</body>
第二步:在Servlet中,获取Session中的token数据做对比。如果相同就执行业务操作。然后移除token数据。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
//1.先获取请求参数---封装成为user对象
String username = request.getParameter("username");
String code = request.getParameter("code");
System.out.println("客户端传递过来的验证码:" + code);
String token = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
System.out.println("Session中的验证码是:" + token);
//从Session中删除验证码
request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);
if (token != null && token.equalsIgnoreCase(code)) {
//2.然后把user对象保存到数据库
System.out.println("把[" + username + "] 插入数据库!");
//3.转发到注册成功页面。
// request.getRequestDispatcher("/registOK.jsp").forward(request, response);
response.sendRedirect(request.getContextPath() + "/registOK.jsp");
} else {
response.getWriter().write("请不要重复提交表单!");
}
}
验证码,其实和我们前面讲的token是一样的。可以有效的防止用户恶意的提交数据。
那么验证码我们使用的是谷歌的kaptcha 这个验证码。
第一步:添加kaptcha的类库。到WEB-INF/lib/目录下
第二步:在web.xml中配置kaptcha类库中用于生成验证码的Servlet程序和访问地址
第三步:在页面中使用<img>标签的src属性引入访问路径。(验证码前端验证需要结合Ajax使用。)
第四步:在接收的Servlet程序中通过Session获取验证码对比
第一步:添加kaptcha的类库。到WEB-INF/lib/目录下
第二步:在web.xml中配置kaptcha类库中用于生成验证码的Servlet程序和访问地址
<!-- 配置生成图片的Servlet -->
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<init-param>
<!-- 记住,kaptcha默认是英文验证码,不需要配置,如果改成中文验证码的时候,一定要加上中文字体配置。否则会有乱码 -->
<param-name>kaptcha.textproducer.font.names</param-name>
<param-value>楷体</param-value>
</init-param>
</servlet>
<!-- 配置访问路径 -->
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/kaptchaServlet</url-pattern>
</servlet-mapping>
第三步:在页面中使用<img>标签的src属性引入访问路径。(验证码前端验证需要结合Ajax使用。)
<!-- 使用img标签引入验证码。也可以使用width和height属性控制验证码的大小 -->
<img alt="验证码找不到" src="kaptcha.jpg" width="80" height="25" />
第四步:在接收的Servlet程序中,使用如下代码获取验证码
// 获取之前生成的验证码
String code = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
// 移除生成的验证码
request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);
参数说明:
根据以上配置来看 想要使用中文中文验证码比较麻烦,可以使用自定义修改过的mykaptcha-2.3.2.jar;
方法如下:
1.使用中文验证码,加入
2.在配置com.google.code.kaptcha.servlet.KaptchaServlet程序到web.xml配置文件中(帮我们生成图片验证码)
3.拷贝笔记中的words.txt文件到src目录
4.配置启用中文验证码
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<init-param>
<param-name>myWorlds</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>kaptcha.textproducer.font.names</param-name>
<param-value>楷体</param-value>
</init-param>
<init-param>
<param-name>myStyle</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/kaptchaServlet</url-pattern>
</servlet-mapping>
相关资源下载地址:https://download.csdn.net/download/qq_25106373/10568856
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!