当前位置: 首页 > 编程日记 > 正文

34.TokenInterceptor防止表单重复提交

转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html

由于某些原因,用户在进行类似表单提交的操作后,以为表单未被提交,会进行多次的重复提交。为了避免用户多次提交给服务器带来负荷。我们会对表单提交这样的操作进行一些处理,以告诉用户不要重复提交。下面我们建立struts2token项目,使用struts2的token拦截器来实现此案例。
步骤一,编写login.jsp页面,内容如下:
<%@ page language="java" pageEncoding="UTF-8"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<html>

<body>

<form action="<%=request.getContextPath()%>/login.action" >

姓名:<input type="text" name="username"><br>

密码:<input type="password" name="password"><br>

<input type="submit" value="登录">

<s:token></s:token>

</form>

</body>

</html>
说明,此登录页面中的关键技术就是使用了标签库中的<s:token></s:token>标签,它的作用就是在用户访问此页面时会生成一个sessionId,在提交时会服务器会据此验证表单是否已提交。“To set a token in your form, you should use the token tag. This tag is required and must be used in the forms that submit to actions protected by this interceptor”,这句话的大概意思就是我们必须要在提交的表单中使用这个token tag,这样提交到的Action便能配置TokenInterceptor拦截器验证表单是否重复提交。
步骤二,编写LoginAction,主要代码如下:
package com.asm;
public class LoginAction extends ActionSupport {

public String execute() throws Exception {

System.out.println("---->执行execute方法...");

return SUCCESS;

}

}
步骤三,struts.xml主要配置内容如下:
<struts>

<package name="tokenTest" extends="struts-default">

<action name="login" class="com.asm.LoginAction">

<result name="success">/success.jsp</result>

<result name="invalid.token">/subError.jsp</result>

<interceptor-ref name="token"></interceptor-ref>

<interceptor-ref name="defaultStack"></interceptor-ref>

</action>

</package>

</struts>

说明:在此Action下,我们配置了token拦截器,另注意到在此Action下我们还配置了一个“invalid.token”result,因为“This interceptor uses a fairly primitive technique for when an invalid token is found: it returns the result invalid.token, which can be mapped in your action configuration”。它的大概意思就是:提交时服务器如果根据token标签产生的sessionId判断出表单已提交,它则返回invalid.token指向的视图。比如这里,如果重复提交则会转到.../subError.jsp中去。另不要忘记了引入默认的拦截器栈。补充:关于token拦截器更多细节可以访问org.apache.struts2.interceptor.TokenInterceptor类的api说明。
步骤四,编写配置中所用到jsp页面,这些页面编写简单,在此省去。
步骤五、发布测试,请注意访问login.jsp页面时,查看源文件时会发现增加了两个隐藏域信息。
步骤六、更换拦截器:我们还可以使用tokenSession拦截器,它的功能比上面的增强,它能保证持有相同sessionId的并发请求等待第一个完成之后才能被提交处理,但是它返回的是action执行后的result.接着上例,我们只需要在配置中作如下修改:把上面的token拦截器改成<interceptor-ref name="tokenSession"></interceptor-ref> 即可。随后便可以测试,测试时会发现如果我们重复提交,它总是返回到上一次的success.jsp页面,但是它并不是经过LoginAction中的execute处理后返回(我们System.out.print语句在重复提交时并未打印出来),而是此拦截器判断出是重复后直接返回上一次提交转向的页面。

转载于:https://www.cnblogs.com/sharpest/p/5587622.html

相关文章:

使用arthas采集火焰图

火焰图是用图形化的方式来展现profiler工具采集的性能数据&#xff0c;对数据进行统计和分析&#xff0c;方便找出性能热点。 现在我们使用arthas采集JVM的火焰图。 1.首先你需要安装arthas 说是安装其实就是下载解压&#xff0c;arthas是不需要安装的。 下载 — Arthas 3.5…

sudo配置文件详解及实战

2019独角兽企业重金招聘Python工程师标准>>> 安装NGINX之后每次都需要切换ROOT用户做配置文件修改和启动&#xff0c;为了加强安全&#xff0c;ROOT用户一般是不允许直接提供给应用开发人员或者运维人员的&#xff0c;所以需要提供一种方法可以一般用户执行ROOT用户…

Centos中文输入法安装以及切换

鼓捣鼓捣&#xff08;我是一只菜鸟&#xff09;&#xff0c;终于在我的Centos上面装上我的大中华输入法了&#xff0c;哈哈哈哈下面就简单描述下安装过程吧&#xff01;&#xff01;&#xff01;centos6.5用yum安装中文输入法打开终端&#xff0c;进入root用户&#xff08;命令…

【MATLAB】矩阵信息的获取

1、矩阵结构 矩阵的结构是指矩阵子元素的排列方式。 函数名称函数功能isempty(A)检测矩阵是否为空isscalar(A)检测矩阵是否是单元素的标量矩阵isvector(A)检测矩阵是否是只具有一行或一列元素的一维向量issparse(A)检测数组是否是系数矩阵 返回1表示该矩阵是某一特定类型的矩…

Android Gradle Plugin 源码解析(上)

一、源码依赖 本文基于: android gradle plugin版本&#xff1a; com.android.tools.build:gradle:2.3.0 gradle 版本&#xff1a;4.1 Gradle源码总共30个G&#xff0c;为简单起见&#xff0c;方便大家看源码&#xff0c;此处通过gradle依赖的形式来查看源码&#xff0c;依赖源…

Guice系列之用户指南(七)

原文地址&#xff1a;https://code.google.com/p/google-guice/wiki/ToConstructorBindings Constructor Bindings&#xff08;构造器绑定&#xff09;&#xff1a;在父类型上绑定子类实现的构造函数。 贴代码&#xff1a; 12345678910111213141516171819202122232425262728293…

Linux系统火焰图

CentOS7.8 安装perf #yum install perf 执行perf 执行perf record 命令&#xff0c;记录该PID的行为 #perf record -a -g -p 14851 -- sleep 30 --30秒后退出 需要注意后面生成svg图片的所有命令要和当前perf在同一目录&#xff0c;不然会报错。 #perf report 安装git …

深圳杯---垃圾焚烧厂的经济补偿问题

垃圾围城是世界性难题&#xff0c;在今天的中国显得尤为突出。2012年全国城市生活垃圾清运量达到1.71亿吨&#xff0c;比2010年增长了1300万吨。数据显示&#xff0c;目前全国三分之二以上的城市面临垃圾围城问题&#xff0c;垃圾堆放累计侵占土地75万亩。因此&#xff0c;垃圾…

make -j8以及linux下查看cpu的核数

# 总核数 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数# 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l# 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu …

IDEA2021.3.2拉取maven报错maven-default-http-blocker解决方法

因为IDEA2021.3.2 的Maven是3.8.1后&#xff0c;mvn编译的时候总是提示拉不到依赖&#xff0c;报错如下&#xff1a; Could not validate integrity of download from http://0.0.0.0/... 因为使用HTTP协议下载依赖&#xff0c;可能会导致中间人攻击。 所以Maven 3.8.1就禁止…

2013高教社杯---B碎纸片的拼接复原

破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时间内完成任务。随着计算机技术的发展&a…

oracle--with as

with as把一段查询结果放在临时表&#xff0c;后面的查询中可多次使用 语法&#xff1a; with 别名 as(select * from table) 或 with 别名1 as(select * from table1), ............. 别名n as(select * from tablen) 示例&#xff1a; with 别名 as(select * from table wher…

Flask上下文管理源码分析

略略略...转载于:https://www.cnblogs.com/dzf123456/p/9446220.html

IDEA函数调用关系图插件

Call Graph是一款IDEA插件&#xff0c;用于可视化基于IntelliJ平台的IDE的函数调用图。 这个插件的目标是让代码更容易理解&#xff0c;有助于读懂和调试代码。 安装插件 安装后&#xff0c;通过View - Tool Windows - Call Graph &#xff0c;激活窗口 激活后&#xff0c;需要…

[Notice]博客地址转移 vitostack.com

个人博客地址转移至vitostack.com 这里可能不会经常更新。 欢迎访问新地址。 转载于:https://www.cnblogs.com/Vito2008/p/5595430.html

【MATLAB】find 函数 总结

【MATLAB版本为2014a】 MATLAB中函数find函数的作用是进行矩阵元素的查找&#xff0c;它通常与关系函数和逻辑运算相结合。 indfind(X,...)&#xff1a;该函数查找矩阵中的非零元素&#xff0c;函数返回这些元素的双下标[row,col]find(X,...)&#xff1a;该函数查找矩阵X中的…

与HTTP关系密切的协议:IP、TCP、DNS

TCP/IP协议族的协议挺多的&#xff0c;我们精力有限&#xff0c;不可能一个个都了如指掌&#xff0c;那就挑一些与HTTP协议关系了解吧~ 负责传输的IP协议 按层次分&#xff0c;IP协议位于网络层。 IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里&#xff0…

C#精髓 第四讲 GridView 72般绝技

说明&#xff1a;准备出一个系列&#xff0c;所谓精髓讲C#语言要点。这个系列没有先后顺序&#xff0c;不过尽量做到精。可能会不断增删整理&#xff0c;本系列最原始出处是csdn博客,谢谢关注。 C#精髓 第四讲 GridView 72般绝技 作者&#xff1a;清清月儿 主页&#xff1a;ht…

Android layer-list(3)

&#xfeff;&#xfeff;Android layer-list&#xff08;3&#xff09; 在附录文章3、4的基础上&#xff0c;就Android layer-list再写一个较为复杂的应用。 先写布局文件&#xff0c;该布局涉及到LinearLayoutCompat&#xff0c;关于LinearLayoutCompat参看附录文章5。 布局文…

【MATLAB】二维矩阵可视化 MATLAB绘图

基本绘图函数 1、plot(y) 如果y是向量&#xff0c;则采用向量的索引值作为横坐标值&#xff0c;以向量元素的值作为纵坐标值。 如果y是实数矩阵&#xff0c;则相当于对y的每一列进行二维绘图。 如果y是复数组成的向量&#xff0c;则相当于plot(real(y),imag(y))。 2、plot…

phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)

phpstudy一个域名配置两个网站&#xff08;一个是thinkphp5&#xff0c;一个是原生php&#xff09; 一、总结 一句话总结&#xff1a;把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa.hk\**方式访问原生网站会被当成thinkphp子模块的问题 最后的解决方法&a…

bzoj3442 学习小组

目前处于迷之TLE状态 -----6.21更新 已AC 3442: 学习小组 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 200 Solved: 87Description 【背景】坑校准备鼓励学生参加学习小组。【描述】共有n个学生&#xff0c;m个学习小组&#xff0c;每个学生有一定的喜好&#xff0c;只愿…

C语言经典著作导读

本人不是卖书的&#xff0c;我也不会给出任何购书链接&#xff0c;只是给C语言学习者推荐一条学习的方向。如果你喜欢看电子书网上很多&#xff0c;如果你喜欢纸质那么就买吧&#xff0c;经典的书值得收藏&#xff0c;是对版权的尊重&#xff01; 基础篇 1.《写给大家看的C语言…

针对2013年B题碎纸片拼接问题(附件一、附件二)

题目链接&#xff1a;https://blog.csdn.net/CSDN___CSDN/article/details/82051821 http://www.shumo.com/wiki/doku.php?id2013_%E5%B9%B4%E5%85%A8%E5%9B%BD%E5%A4%A7%E5%AD%A6%E7%94%9F%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1%E7%AB%9E%E8%B5%9B_cumcm_%E8%AF%95%E9%A2%98…

什么是类型别名?什么是潜在类型?

2019独角兽企业重金招聘Python工程师标准>>> 别名类型 在Go语言里&#xff0c;可以用type声明自定义的各种类型。在这些自定义的类型中&#xff0c;有一种被叫做别名类型。 举个例子&#xff1a; type MyString string这句代码的意思是&#xff1a;MyString是strin…

Linux网络编程必看书籍推荐

首先要说讲述计算机网络和TCP/IP的书很多。 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S&#xff0e;Tanenbaum的《计算机网络》第五版&#xff0c;这本书难易适中。 《计算机网络&#xff08;第5版&#xff09;》是国内外使用最广泛、最权威的计算机…

5个最佳的Android测试框架

2019独角兽企业重金招聘Python工程师标准>>> 谷歌的Android生态系统正在不断地迅速扩张。有证据表明&#xff0c;新的移动OEM正在攻陷世界的每一个角落&#xff0c;不同的屏幕尺寸、ROM /固件、芯片组以及等等等等&#xff0c;层出不穷。于是乎&#xff0c;对于Andr…

【CTF】实验吧 凯撒变异

通过分析可以知道前四个“afZ_”四个的ASCII码值与“flag”的ASCII码值依次相差5&#xff0c;6&#xff0c;7&#xff0c;8。 #include <stdio.h> #include <string.h> int main () {char str[40]"afZ_r9VYfScOeO_UL^RWUc";int i0,j5;while(i<strlen…

ant design pro (八)构建和发布

一、概述 原文地址&#xff1a;https://pro.ant.design/docs/deploy-cn 二、详细 2.1、构建 当项目开发完毕&#xff0c;只需要运行一行命令就可以打包你的应用&#xff1a; npm run build 由于 Ant Design Pro 底层使用的 roadhog 工具&#xff0c;已经将复杂的流程封装完毕&a…

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程&#xff0c;信号&#xff0c;管道&#xff0c;消息队列&#xff0c;信号量&#xff0c;共享内存 参考&#xff1a;《linux编程从入门到精通》,《Linux C程序设计大全》,《unix环境高级编程》 参考&#xff1a;C和指针学习 说明&#xff1a;本文非常的长…