自助餐的英文翻译英语怎么说-成人高考什么时候出成绩


2023年3月30日发(作者:firstofmay)

struts2中使用token避免重复提交

1.在中

/pages/

/pages/

/pages/

/pages/

input

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;

}

}

....

标签配置部分

token

ag

empty

保存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

必须写上这个否则会报找不到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\"%>

MyJSP\'\'startingpage

insert

---------------------------------------------------------------------

<%@pagelanguage=\"java\"pageEncoding=\"ISO-8859-1\"%>

<%@tagliburi=\"/struts/tags-bean\"prefix=\"bean\"%>

<%@tagliburi=\"/struts/tags-html\"prefix=\"html\"%>

JSPforInsertFormform

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/\">

提交

javascript防止表单重复提交

 (请按一次,耐心等待!) 

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/\">

Inserttitlehere

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在线翻译读音例句