自助餐的英文翻译英语怎么说-成人高考什么时候出成绩
2023年3月30日发(作者:firstofmay)
struts2中使用token避免重复提交
1.在中
2.在页面中加
3.
token:在活动中检查合法令牌(token),防止表单的重复提交;在
token-session:同上,但是在接到非法令牌时将提交的数据保存在session中;不会在
产生提示信息
只会在后台发出警告并处理,如下:
警告:FormtokenKO80SIJW4F84034NG5HM1ZBUGOVNY64Ddoesnotmatchthesessiontokennull.
编辑特别推荐:
为struts1.2增加token标签令牌标签[修改更新2009-07-28修复了一个
BUG]
2009-07-2317:28
2009-07-28更新提醒:修改了一个页面不能存在多个表单的BUG
;
ption;
rvletRequest;
eption;
ter;
port;
s;
nts;
rocessor;
publicclassTokenTagextendsTagSupport{
publicintdoEndTag()throwsJspException{
HttpServletRequestrequest=
(HttpServletRequest)uest();
JspWriterout=();
try{
Objecttmp=null;
Stringtoken=(tmp=
sion().getAttribute(CTION_TOKEN_KEY))==nu
ll?tance().generateToken(request):ng()
;
if(token!=null){
sion().setAttribute(CTION
_TOKEN_KEY,token);
n(\"
name=\"\"+_KEY+\"\"value=\"\"+token+\"\"/>\");
}
}catch(IOExceptione){
tackTrace();
}
_PAGE;
}
}
....
标签配置部分
保存Struts令牌
]]>
....
实例一:防止表单重复提交
防止重复提交:有两种方法:一是使用token拦截器,二是使用tokenSession
第一种方法步骤:
1、先在页面中放一个令牌。调用Struts标签,服务器自动分派。
2、在文件定义清明时节雨纷纷全诗朗诵 token拦截器。
1.
2.
3.
4.
3、在文件配置有重复提交的错误页面,即:
1.
第二种方法基本与第一种方法基本相同,只不用配置重复提交的错误页面,如果发生重复提交,返回success。
实例二:PreResultInteceptor
这个功能是在Action返回到result时执行。
拦截器-->Action-->Result-->拦截器
实现步骤:
1、定义一个类实现PreResultListener接口,实现beforeResult方法
classTestPreResultInteceptorimplementsPreResultListener{
2.
voidbeforeResult(ActionInvocationarg0,Stringarg1){
4.
n(\"在结果集返回之前执行了beforeResult方法\");
6.
7.}
8.
9.}
2、自定义一个拦截器与上面定义类进行绑定。
classTestInterceptorextendsAbstractInterceptor{
2.
3.@Override
4.
Stringintercept(ActionInvocationinvocation)throwsException{
6.
ResultListener(newTestPreResultInteceptor());
8.
n(\"在action执行execute方法之前执行进行拦截\");
10.
result=();
12.
n(\"在action执行execute方法之后执行进行拦截\");
14.
result;
16.
17.}
18.
19.}
20.
很多时候要防止重复提交,比如论坛在发表提问的时候,要是不控制那就可以一直提交~
使用方法:论坛为例
:为跳到提问页面的action
:为提问页面
:为提问成功提交的action
:处理提问之后的跳转的jsp
首先在ask这个action里面加入saveToken(request);这是为了在提问页面即页面生成一个
隐藏的表单
value=\"a6b9ff6834284444001b8206723b654d\">
在ask。jsp页面做以下处理:使用form为
此要引入这个标签否则不会生成这个隐藏表单。
form写法1.1之后不写name没有这个属性但要在struts-config。xml里面配置这个actionform我
们可以定义为question同时要配置askok这个action里面要写入对应的form
如果要在ask。jsp这个页面做js处理要用到FORMname的话可以直接写question因为struts
自动生成了这个form的name生成之后的:
action=\"/\">
这个页面自动生成加入FORMname
然后在里面写if(isTokenValid(uest(),true)){
添加提问
}else
{
跳转提示
}
Struts1.2之Token重复提交
遇难集中营2007-12-1712:16:24阅读130评论0字号:大中小
--------------------------------------------------------
<?xmlversion=\"1.0\"encoding=\"UTF-8\"?>
\"/dtds/struts-config_1_\">
attribute=\"insertForm\"
input=\"/\"
name=\"insertForm\"
path=\"/insert\"
scope=\"request\"
type=\"Action\"/>
-------------------------------------------------------------------------
<%@pagelanguage=\"java\"import=\".*\"pageEncoding=\"ISO-8859-1\"%>
<%@tagliburi=\"/struts/tags-html\"prefix=\"html\"%>
---------------------------------------------------------------------
<%@pagelanguage=\"java\"pageEncoding=\"ISO-8859-1\"%>
<%@tagliburi=\"/struts/tags-bean\"prefix=\"bean\"%>
<%@tagliburi=\"/struts/tags-html\"prefix=\"html\"%>
password:
username:
email:
-------------------------------亚的拼音 --------------------------------------InsertAction
/*
*GeneratedbyMyEclipseStruts
*Templatepath:templates/java/
*/
;
rvletRequest;
rvletResponse;
;
Form;
Forward;
Mapping;
Message;
Messages;
Form;
/**
*MyEclipseStruts
*Creationdate:12-17-2007
*
*XDocletdefinition:
*@path=\"/insert\"name=\"insertForm\"input=\"/\"scope=\"request\"validate=\"true\"
*/
publicclassInsertActionextendsAction{
/*
*GeneratedMethods
*/
/**
*Methodexecute
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@returnActionForward
*/
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
InsertForminsertForm=(InsertForm)form;//TODOAuto-generatedmethodstub
if(!isTokenValid(request)){
ActionMessageserrors=newAct古诗配画一等奖 ionMessages();
(\"insertToken\",newActionMessage(\"\"));
rors(request,errors);
ken(request);
utForward();
}else{
oken(request);
}
returnnull;
}
}
--------------------------------------------------------------------PerpareInsertAction
/*
*GeneratedbyMyEclipseStruts
*Templatepath:templates/java/
*/
;
rvletRequest;
rvletResponse;
;
Form;
Forward;
Mapping;
/**
*MyEclipseStruts
*Creationdate:12-17-2007
*
*XDocletdefinition:
*@validate=\"true\"
*/
publicclassPerpareInsertActionextendsAction{
/*
*GeneratedMethods
*/
/**
*Methodexecute
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@returnActionForward
*/
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
//TODOAuto-generatedmethodstub
ken(request);
rward(\"insert\");
}
}
------------------------------------------------------------------ApplicationResources
#Resourcesforparameter\'ationResources\'
#ProjectStruts1.2Token
=repeatsubmit!
================================说明=======================================
利用Struts的同步令牌(token)机制来解决重复提交问题。
执行流程:
PerpareInserAction---->---->InsertAction
在PrepareInsertAction中创建一个token令牌
saveToken(request)
在InsertAction对其进行判断
isTokenValid(request)如果为假表示进行了重复的操作
saveToken(request)
在session中创建一个令牌(rocessor完成)
resetToken(request)
从session中删除token
使用JavaScript和Struts防止表单页面重复提交
(2007-04-0920:40:37)
转载
标签:
j2ee
分类:J2EE
环境:
TOMCAT5.0.28和STRUTS1.2(MYECLIPSE5.1.1集成)
1.使用JAVASCRIPT防止表单重复提交:
原理很简单,通过计算时间来判断是否是已提交过的表单,代码如下:
<%@pagelanguage=\"java\"contentType=\"text/html;charset=gb2312\"
pageEncoding=\"gb2312\"%>
\"/TR/html4/\">
2.使用Struts的Token来防止表单(FORM)重复提交:
基本原理:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进
行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌
除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并
再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
工作流程:->TokenAction(toregister)->->TokenAction(register)->
:
:
name=\"tokenForm\"scope=\"request\"input=\"/\"validate=\"false\">
TokenAction(toregister):
publicActionForwardtoregister(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
//保存Token
saveToken(request);
n(\"aftersaveTokenintoregister:\"
+generateToken(request));
rward(\"register\");
}
这个方法中saveToken(request)是关键.它向服务器端的SESSION中保存1个TOKEN,同时向客户端发送一
个相同的TOKEN,这个TOKEN是用隐藏域表示的.
:
<%@tagliburi=\"/tags-html\"prefix=\"html\"%>
<%@pagelanguage=\"java\"contentType=\"text/html;charset=ISO-8859-1\"
pageEncoding=\"ISO-8859-1\"%>
\"/TR/html4/\">
register
name:
password:
<%
ationattributeNames=ributeNames();
while(eElements())
{
Stringname=(String)ement();
Objectvalue=ribute(name);
n(name+\"=\"+value);
}
%>
中间的java语句可以让我们看到此页面保存的TOKEN的值.
这里有一点值得注意:我通过测试,使用TOKEN防止表单重复提交只能用STRUTS的THML标签来生成表
单,如果用我们常用的HTML语句的FORM表单则无法正常工作,同时这里的FORM对应一个TokenForm
类,TokenForm类代码如下:
packageform;
Form;
publicclassTokenFormextendsActionForm{
privateStringname;
privateStringpassword;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
rd=password;
}
}
下面看一下关键的TokenAction中的register方法:
publicActionForwardregister(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
StringtokenString=
(String)ameter(\"\");
n(\"inregistertokenis:\"+tokenString);
if(isTokenValid(request,true))
{
//succes明月几时有把酒问青天全诗 soperation!
ribute(\"message\",\"Congratulations!\");
}else
{
ribute(\"message\",\"Sorry,therequesthasbeen
handled!\");
}
rward(\"message\");
}
isTokenValid(request,true){}这个方法是验证客户端的TOKEN是否与服务器端的一样.如果一样,
则在SESSION中保存一个值为success的message信息.如果不一样的保存Sorry,therequest
hasbeenhandled!并且修改服务器端的TOKEN的值(true的作用便在于此).
此外,在TokenAction中还有reset(request)方法,王世坚给蒋万安的大礼 这个方法是删除服务器保存的Token.
这样.就可以实现使用STRUTS来防止表单的重复提交了.
总结:这2种方法都可以防止重复提交表单.但是在下列情况下还是不能防止的:比如一个用户登录系统后
点回退键,之后刷新页面,再次登录页面.
遇到这种情况,个人认为则需要去判断SESSION中保存的内容来判断用户是否已经登录了.并通过返回不
同的结果来显示不同的页面.如果有更好的意见,请予以提出,不胜感激.
开始一直都对这个重复提交的问题理解的都不是很好,就知道有几个方法用了就可以达到效
果,之于这几个方无限风光尽被占上一句 法,为什么能够达到这个效果就不得而知了。
现在,对这几个方法回头整理一下,一下子就明白了。我用的是struts的令牌。
举例,以论坛留言来说明:
论坛发贴首先需要跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,
贴子就发表了,所以这里经过两个步骤:
第一个进入发帖页面:
/InsertToken/?method=add
Java代码
ActionForwardadd(ActionMappingmapping,ActionFormform,
rvletRequestrequest,HttpServletResponseresponse){
ken(request);
rward(\"success\");
5.}
成功后,会生成新的页面:
这个生成的新页面中都会包含类似如下的类容:
Hmtl代码
1.
2.
cfbe4748cf5b7b1a4d87e\">
3.
这一组标签中value的值是经常变换的,每刷新一次,重新生成新页面的时候就会变化一次
而且这组标签都会生成在form标签内部,如果没有form标签是不会生成的。
看了源代码之后过程如下:
首先
Java代码
synchronizedvoidsaveToken(HttpServletRequestrequest){
ssionsession=sion();
token=generateToken(request);
(token!=null){
ribute(CTION_TOKEN_KEY,token);
6.}
7.}
synchronizedStringgenerateToken(HttpServletRequestrequest){
ssionsession=sion();
generateToken(());
11.}
这里在保存后这里获得了session的id并进行了generateToken(())的操作返
回一个可变的值,然后保存在session中。并用CTION_TOKEN_KEY指代,这
个是第一步。
然后rward(\"success\");生成页面。这个新的页面如果有form标签那么就会
在中进行如下的执行,以形成控制重复提交的必要标签
Java代码
tedStringrenderToken(){
Bufferresults=newStringBuffer();
ssionsession=sion();
(session!=null){
token=(String)ribute(CTION_TOKEN_KEY);
(token!=null){
(\"
(_KEY);
(\"\"value=\"\");
(token);
(l()){
(\"\"/>\");
13.}else{
(\"\">\");
15.}
(\"
17.}
18.}
ng();
20.}
在此取得CTION_TOKEN_KEY中之然后一起合成新页面的标签就是上面的
在新页面形成之后,可以进行相应的操作,然后提交。
/insertinfo?method=insertinfo
Java代码
ActionForwardinsertinfo(ActionMappingmapping,ActionFormform,
rvletRequestrequest,HttpServletResponseresponse){
(nValid(request)){
n(\"****执行****\"+(token));
oken(request);
rward(\"insertok\");
7.}else{
n(\"++重复提交++\");
ken(request);
rward(\"insertnotok\");
11.}
12.}
进入这块代码,首先是验证是不是重复提交(if),然后通过函数resetToke出塞二首 n从当前session
范围内删除令牌属性。
或者已经提交(else),然后再通过函数saveToken在session中重新设置新的值。
过程分析具体如下:
Java代码
synchronizedbooleanisTokenValid(HttpServletRequestrequest,
nreset){
3.//Retrievethecurrentsessionforthisrequest
ssionsession=sion(false);
(session==null){
false;
7.}
8.//Retrievethetransactiontokenfromthissession,and
9.//resetitifrequested
saved=
11.(String)ribute(CTION_TOKEN_KEY);
(saved==null){
false;
14.}
(reset){
oken(request);中国诗歌网个人登录
17.}
18.//Retrievethetransactiontokenincludedinthisrequest
token=ameter(_KEY);
(token==null){
false;
22.}
(token);
24.}
第一次得到的saved和token值是一样的。这里CTION_TOKEN_KEY
=\"\"
_KEY就是生成标签的name属性
通过比较第一次相同提交成功。
重设和第一次一样。
然后刷新提交后的页面,或者后退重填提交。此时生成的标签的value不变。但是在第一次
的时候resetToken已经从当前session范围内删除令牌属性。所以直接进入else。这里报
告重复提交。同时再次保存token,此时的保存值又和value值不一样。所以重复体提交失
败。
(17KB)
描述:代码
下载次数:209
更多推荐
token是什么意思en在线翻译读音例句
发布评论