jsp

位置:IT落伍者 >> jsp >> 浏览文章

JSP、Struts避免Form重复提交的几种方案


发布日期:2023年10月02日
 
JSP、Struts避免Form重复提交的几种方案

javascript 设置一个变量只允许提交一次

还是javascript将提交按钮或者image置为disable

onsubmit=getElById(submitInput)disabled = true; return true;>

利用struts的同步令牌机制

利用同步令牌(Token)机制来解决Web应用中重复提交的问题Struts也给出了一个参考实现

基本原理

服务器端在处理到达的请求之前会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较看是否匹配在处理完该请求后且在答复发送给客户端之前将会产生一个新的令牌该令牌除传给客户端以外也会将用户会话中保存的旧的令牌进行替换这样如果用户回退到刚才的提交页面并再次提交的话客户端传过来的令牌就和服务器端的令牌不一致从而有效地防止了重复提交的发生 if(isTokenValid(requesttrue)){

//yourcodehere

returnmappingfindForward(success);

}else{

saveToken(request);

returnmappingfindForward(submitagain);

}

Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的具体实现可以参考TokenProcessor类中的generateToken()方法 //验证事务控制令牌会自动根据session中标识生成一个隐含input代表令牌防止两次提交

在action中 ////value=aaffdcccae>

if(!isTokenValid(request))

errorsadd(ActionErrorsGLOBAL_ERROR

newActionError(errortransactiontoken));

resetToken(request);//删除session中的令牌

action有这样的一个方法生成令牌

protectedStringgenerateToken(HttpServletRequestrequest){

HttpSessionsession=requestgetSession();

try{

byteid[]=sessiongetId()getBytes();

bytenow[]=

newLong(SystemcurrentTimeMillis())toString()getBytes();

MessageDigestmd=MessageDigestgetInstance(MD);

mdupdate(id);

mdupdate(now);

return(toHex(mddigest()));

}catch(IllegalStateExceptione){

return(null);

}catch(NoSuchAlgorithmExceptione){

return(null);

}

}在更新的时候防止按钮重复点击主要是用Session来做判断

在JSP/Servlet中可以

JSP页面 SynchroTokenjava

packagecomlimsutil;

importorgapachestrutsutil*;

importjavaxservlet*;

importorgapachestrutsaction*;

/**

*

Title:SynchroToken

*

Description:

*

Copyright:Copyright(c)

*

Company:NetStar

*@authorJstar

*@version

*Createdin//

*/

publicclassSynchroToken{

publicfinalstaticjavalangStringTOKEN_NAME=_token;

publicstaticbooleancheckToken(HttpServletRequestrequest){

booleanisEqual=false;

HttpSessionsession=requestgetSession();

StringformToken=requestgetParameter(TOKEN_NAME);

StringsessionToken=(String)sessiongetAttribute(TOKEN_NAME);

Systemoutprintln(formToken:+formToken+sessionToken:+

sessionToken);

if(formToken!=null&&sessionToken==null){

sessionsetAttribute(TOKEN_NAMEformToken);

isEqual=true;

}

returnisEqual;

}

/**

*Insertthemethodsdescriptionhere

*Creationdate:(//::PM)

*@returnjavalangString

*@paramrequestjavaxservlethttpHttpServletRequest

*/

publicstaticStringgetToken(HttpServletRequestrequest){

Stringtoken=+SystemcurrentTimeMillis();

HttpSessionsession=requestgetSession();

if(session!=null){

sessionremoveAttribute(TOKEN_NAME);

}

returntoken;z

}

/**

*Insertthemethodsdescriptionhere

*Creationdate:(//::PM)

*@returnjavalangString

*/

finalstaticjavalangStringgetTOKEN_NAME(){

returnTOKEN_NAME;

}

publicstaticStringmessage(PageContextpageContextStringkey)throws

JspException{

returnssage(pageContextnullnullkey);

}

}

               

上一篇:Tomcat+JSP经典配置实例

下一篇:开发一个调试 JSP 的 Eclipse 插件