00:00
我们来研究一下在抓图里面是如何来防止表单重复提交的,首先呢,我们复习一下什么是表单重复提交,关于表单重复提交啊,我们在讲http session的时候呢,有过详细的讨论。大家也可以去翻看一下以前的视频。单的重复提交,如果我刷新表单页面再提交的话,这个不算重复提交,我刷新表单页面跟我新开一个表单页面是不是一样啊?这个时候提交的话,属于是初次提交,他不算。而以下几种情况的话是,比方说多次点击提交按钮。已经成功点回退债点提交。在控制机响应页面为转发的情况下,注意是转发哈,已经成功提交,再点击F5的时候,这三种情况算是表单的重复提交。
01:02
我们具体的话呢,通过例子再来说明一下。新建一个页面。Coconer JSP。这个页面呢,我们来写个表单。写一个S。Form action。He token。写一个字段。Name you the name。Lib。Name。T按钮S。Summit。提到p top。新建一个token action。
02:02
Token。Action。继承身。Spot。Q的方法?Return。写一个变量,跟表单页面的U盾name相对应。Private you name。Get out。国内。好了,我们为了模拟出延迟这个效果的话呢,我在这块这个线程停一下在天。
03:02
Z,停两秒。保存哦,这个异常已经抛出了啊。OK,我们这个action就写好了。JSP那也写好了,配置一下。就这。Action。Name。He token。RA后的配置文件。啊。Token action。好了,成功页面的话呢,我们写一个result,也是这个success p。
04:00
B。我这个响应类型应该是,嗯,发吧,一会的话我们再来看一下这个响应类型,如果要是重定向的话,它是什么样。走起。走。大。大家注意看哈,在我刷新这个页面的时候,我要是再点提交的话,这不算重复提交,因为我刷这个页面跟我新开,我刷新这个页面跟我新开这个页面是不是一样啊,那我新开一个页面,我要是表单内容填好的话,我再点提交,它怎么能算是重复呢?这不算。输入的硅谷提交。两秒有点延迟哈,打印没问题,这样的话呢,我这个提交就过来了,好了,我们看什么算重复提交。
05:06
第一种情况,我点返回。在不刷新这个页面的情况下再点,这算是重复提交。第一种。第二种。回退,我刷新这个页面,然后呢,输入一个艾特回谷。注意看啊,这个时候我多次点提交按钮,这也算是重复提交,大家看是不是提了三次啊。还有一种情况。在我。是使用转发的这个。响应类型的情况下,这个地址栏没变哈,这个时候点刷新,这也算是重复提交,我们为什么我要强调一个是转发的情况呢。因为要是重定向的话,这个地址栏要是变的话,那就不算了。找一个看看效果,指定type。
06:05
Nine。这个。回退发信。点看爱。推股比较。大家注意到这个是不是目标GSP啊,你要再刷的话,你刷的是JSP,跟那个action没关系,所以说这个时候不算是重复提交。是我们需要明确的第一个问题,怎么转提交三种情况。毕竟。三。表。重复。提交问题第一个什么是?表单的。孔仆。
07:01
提交,哎,我们说了三条。直接复制过来。这三种情况。这边有一个前提哈,说是在不刷新表单页面的情况下干这个事儿,如果你要是返回了,然后刷新表单页面的,别干这个事不刷了。我返回刷表单页面,我再提交的话,那算是一次,那算是一次新的提交。来。嗯。哎,第三种情况。好了,我们需要注意的是。两点,第一点。就是这个。如果刷新表单页面再提交的话,这不算是重复提交。
08:05
二种情况说,若使用的是redirect的响应类型,响应。也行,然后。已经递交成功。再点击。发。不算提交。你想你想明白吧,这是我们需要注意的几个点。第二个,我们说一下表单重复地交的危害。
09:01
大叔,有什么危害啊?肯定是加重服务器负担呢,因为你已经提交了,然后你又重复提的话,那不是加重服务器负担吗?而且还可能导致操作出错。两个缺点,第一个加重服务器负担,第二个可能可能导致错误操作。那么在抓two里面,我们如何来解决表扬的重复提交问题呢?那这个解决的原理呢,跟我们在讲三的时候,那个解决的原理是一样一样的。Throw two一共提供了两个拦截器帮我们解决这个问题。这两个拦截器可以任选器一,一个是token拦截器,一个是TOKEN3拦截器。我们以这个ton拦截器来进行说明。看这个图,我们来说这个原理。首先。我要在这个表单页面里边。
10:00
在那个form标签里边放这样的一个s token标签。就是在。这个里边放一个标签。S。这里面呢,我们需要注意的是,这个标签一定要作为form的一个标签来组合。啊,那我在加载这个表单页面的时候,这个标签就会执行,这个标签会来做两件事,第一件事。它会生,它会生成一个隐藏域。那隐藏域里边会有一个请求参数值。同时呢,它还会往30里边放一个属性值,注意。请求参数的这个值,隐藏域的这个请求参数值跟30里边那个属性值是一样的,好了,然后我来点sum提交啊,经过talk拦截器。套根拦截器呢?会来干这样几件事,第一个取出隐藏域的值。
11:01
第二个取出赛程的属性值,比较是不是一样,因为放的时候这两个值就一样,然后比的时候如果要是一样的话,OK,你执行后续的拦截器。不一样呢,就算是重复提交,我会给你返回一个invalid token这样的一个result。我们再看。如果重复提交的情况呢,即我已经点击。Summit。去后续页面,然后的话呢,我再点一个返回,那这个时候我要是点返回的话。这个时候。Ice con是。不执行的,那不执行那就说明3IN里边没有值,因为3IN里面刚才那个值已经被我清了呀,好了,这个时候我点提交到这个拦截器之后,一比较两个值是不是不一致啊,隐藏于这个值其实还还在,你点提交吗?表达提交的话,那个值还在吗?但三那个值刚才不是已经被remove了吗?不一致,OK,重复提交,那这就是它的基本原理。
12:10
下面我们来看具体的步骤。做笔记。但。巴兔。解决表单的。重复提交问题。好了,我们看具体步骤,第一步的话呢,刚才我们已经看到了,在。X form中。添加N聊天。好了,这个的话呢,会来做两件事。第一个生成一个隐藏欲,第二个在三中。
13:01
添加一个属性值,其中隐藏域的那个值,三年里边那个属性值是是。点长域的值和。三身的属性值是。质的好,这个值的话呢,会逐够的随机逐够的唯一。第二步。只用。Token。Token。Fashion。连接器,哎,这里边需要说明的。这两个拦截器都不在默认的拦截器里边。这两个环节均。不在默认的拦截器站中。所以需要手工配置一下。
14:06
好了。若使用。Gogan拦截器得需要。指一个。高点歪理的。若使用。Token。Session拦截器则不需要配置。任何其他的。这里边的话呢,我们还要说一下这两个拦截器有什么区别。Get up。组建。
15:01
欧式解决表单横幅提交问题。这是第一点,第二点。使用这个高频拦截器啊,我们会去这样的一个。使用token拦截器会软。To valley的。这个。Result。只用。高跟session拦截器则还会响应那个。目标页面。不会。执行。
16:00
目标。Action的方法六项。什么都没发生过呀。实际上的话呢,这块说不是不会执行,目标action方法是根本就不会执行,后续的拦截器不会执行。Session后续拦截。OK,这就是我们关于如何来处理表单重复提交的笔记。走一个吧。首先我需要来加上一个。In加完了,然后的话呢。找到我们的trut配置文件。我就在这X里面指定我使用的啊。
17:01
三体乞丐。我默认的话呢,我来用这个before。打开我们看一下哈。啊,默认来用这个default stack。在这个之前。加上那个。拦截器。找到struts default那个配置文件。在这儿。看一下。往下翻。我们来看这个default sta。大家看在这个拦截基站里边的话呢,确实是没有那个token或者token赛确实是没有。好了,我们要给它加进来往上翻。拦截器在这呢。Con。
18:07
这里边我们建议大家呢,把这个拦截器啊,放在这个拦截器站在前边,他先执行。如果要是不过的话,后续的拦截器都不会执行了,它会多少的提高一点运行的效率。还小,来配一个。Name in Ali token。我直接就去这个。Go。P。这样一个JSP吧。H4 token error,因为我需要打印这个错误消息,说你已经重复提交了,我们看一看这个错误消息在哪个里边。
19:11
你已经重复低调了。还是第八个可找一个。刷新一定要刷新哈,看一下原文件。我们看到是不是的确生成了这样的一个隐藏域啊。这个隐藏域的话呢,足够的复杂是吧,你看这个Y轴值这么老长。欧了。写一个艾椎股要。有了,好了。我再提交。两秒等一下哈。
20:01
Oh。这个是什么呀,我们用的是不是前面是不是改过,改了一个重定向啊,这样的话呢,是没有这个重复提交问题的,把这个得改过来。把这个去掉就可以对吧。重重庆向的话呢,这就是目标,目标GSP你怎么刷都不会有重复提交的问题。重启。回退。放心。爱他硅谷。B。刷新走。大家看啊,Talk page打开。有错误吗?有一个错误吧,是吧,这个叫action errors,我们可以给他打出来。目标页面。S。
21:00
Action。并不是某一个字段的错误,所以说的话放在了XL里面。好再打印看一下这个。长成这样。那这个错误消息当然是可以覆盖的,去哪个里边找啊。有一个。Message properties打开。Co看到rus。Struts manage properties。打开关于token的。对就是吧。C。放到我的国际化资源文件里边。我加个标记,我就不具体改了哈,准。对,砍。再提交。
22:00
看见了吗?OK的。好了,这是我们使用这个talk拦截器。这里边儿的话呢,我们还有一个注意的一个小细节。嗯。B使用XA。标签来显示。重复提交的出胶剂。然后呢,再错误消息。可以在国际化。国际化资源。文件中。覆盖,覆盖的方式呢?这样的方式。就要说明啊,这个值的话呢,我们实际上是在那个。
23:04
The bus MAT里边查到的。消息可以在爪子。Me this。文件中。好了,这就是刀客拦截机。这边的话呢,我们来看一下这个刀30拦截器。找他。改一下,改成。哦。回退刷新艾特硅谷。所以我刷新看。
24:02
是不是还是这个页面啊。但怎么了?但是的话呢,艾特硅谷并不会被重复的打印说明。已经解决了表单的重复提交问题。这种感觉的话呢,是不错的是吧,哎,我们感受不到。还在起作用。你看我回退再刷新,依旧是这样。这个时候你能感觉到是吧,它不卡,因为我们不是停了两秒嘛,所以说这种方案的话也不错。哎,以上呢,就是我们关于表单重复提交的内容,大家可以来查看一下,查看一下这个笔记,呃,具体原理跟我们30里边解决这个原理是一样一样的,我们在这个这个这个记录点里边的话呢,我们又看到。啊,To的这个拦截器威力巨大,你需要这个功能的话,像我这样配一下给它。加进去,你不需要的话拿走,所以说这个拦截器实际上是可插拔的,就是这个意思。
我来说两句