<%@ page contentType="text/html; charset=GBK"%>
<%
TokenProcessor tokemProcessor=TokenProcessor.getInstance();
tokemProcessor.saveToken(request);
String token=(String)request.getSession().getAttribute(tokemProcessor.FORM_TOKEN_KEY);
%>
<html>
<head>
<title>用户登陆</title>
</head>
<body>
<form action="/testServlet" method="post">
<input name="<%=tokemProcessor.FORM_TOKEN_KEY %>" value="<%=token %>">
<input name="q"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
生成token,主要工具类
import java.securITy.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class TokenProcessor {
private long privious;//上次生成表单标识号得时间值
private static TokenProcessor instance=new TokenProcessor();
public static String FORM_TOKEN_KEY="FORM_TOKEN_KEY";
private TokenProcessor(){
}
public static TokenProcessor getInstance(){
return instance;
}
/**//*
* 验证请求中得标识号是否有效,如果请求中的表单标识与当前用户session中的相同,返回结果true=
*/
public synchronized boolean isTokenValid(HttpServletRequest request){
//未避免session对象不存在时候创建Session对象
HttpSession session=request.getSession(false);
if(session==null){return false;}
String saved=(String)session.getAttribute(FORM_TOKEN_KEY);
if(saved==null){
return false;
}
String token=(String)request.getParameter(FORM_TOKEN_KEY);
if(token==null){
return false;
}
return saved.equals(token);
}
/**//*
* 清楚存储在当前用户session中的表单标识号
*/
public synchronized void reset(HttpServletRequest request){
HttpSession session=request.getSession(false);
if(session==null){
return;
}
session.removeAttribute(FORM_TOKEN_KEY);
}
/**//*
* 产生表单标识号并将之保存在当前用户得session中
*/
public synchronized void saveToken(HttpServletRequest request){
HttpSession session=request.getSession();
try {
byte id[]=session.getId().getBytes();
long current=System.currentTimeMillis();
if(current==privious){
current++;
}
privious=current;
byte now[]=String.valueOf(current).getBytes();
MessageDigest md=MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
String token=toHex(md.digest());
session.setAttribute(FORM_TOKEN_KEY, token);
} catch (NoSuchAlgorithmException e) {
}
}
/**//*
* 将一个字节数转换成十六进制得字符串
*
*/
public String toHex(byte buffer[]){
StringBuffer sb=new StringBuffer(buffer.length*2);
for (int i = 0; i < buffer.length; i++) {
sb.append(Character.forDigit((buffer[i]&0x60)>>4, 16));
sb.append(Character.forDigit(buffer[i]&0x0f, 16));
}
return sb.toString();
}
}
提交处理
import java.io.IOException;
import java.io.PrintWrITer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormDoubleServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
TokenProcessor tokemProcessor=TokenProcessor.getInstance();
if(!tokemProcessor.isTokenValid(request)){
out.println("重复提交");
}
String p1=request.getParameter("p");
if(p1==null||p1.trim().equals("")){
out.println("请输入内容");
}else{
out.println("提交内容被处理");
tokemProcessor.reset(request);//清楚session中的标识
}
}
}
分享到:
相关推荐
SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器
它将常见的校验(目前支持13种)封装起来,并创造性的采用xml来存贮表单验证信息,使得表单的验证成为整个项目中最不重要的环节,开发者只需要定义几个xml标记,就可以创建出复杂的验证策略,而不用编写一行...
\ch23\* 第23章 限制表单重复提交所有例程代码 \ch24\* 第24章 保护受限制访问的JSP资源所有例程代码 \at2\* 附录2 Hibernate框架的应用所有例程代码 \at3\* 附录3 Spring框架的应用所有例程代码 \database\* ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
简洁,快速的验证语法 无需编写验证提示信息(当然也支持自定义提示信息) ...易于其它标准的jsp taglib集成 特殊应用场景支持,如:密码确认,结束日期必须大于开始日期 完整详细的单元测试,保证框架质量
JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...
可以在Action中直接写validate,也可以使用validate框架进行验证,这个我觉得比Struts1.x方便了很多,但是有个问题一直困扰了我,直到现在有个小程序要用到这个方面的知识,那就是验证后如何很好地人性化地在jsp页面...
mxp/在代码编辑环境下,插入一个脚本函数,函数名和参数都可以自定义的 mxp/这个插件很有意思,让你的窗口从大变小,或者从小变大 mxp/用来更新Configuration-TagAttributeList.txt这个文件 mxp/插入中文空格 mxp/...
内容管理:多站点管理,文章发布等,自带一套完整的JSP自定义标签。 消息推送:平台集成极光推送api、邮件发送、短信发送。 web通信:集成websocket,前端自带一个聊天室。 导出功能:excel导出与word导出。 统计...
用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
4、使用一个用户自定义的类完成对一张数据库表的schema定义,继承一个DBObject或者 MultiDBObject类(这个名字学习自一个开源项目expresso,功能也类似),只要 定义好schema,也就是手动设定一下每个column的名称、...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 ...
持,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。 自动验证和完成:自动完成表单数据的验证和过滤,新版新增了IP验证和有效期验 证等更多的验证方式,配合自动完成可以生成安全的数据对象。 ...