SpringMVC中实现的token,防表单重复提交
一:首先创建一个token处理类 ,这里的类名叫 TokenHandler
private static Logger logger = Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token = new HashMap<String, String>();//生成一个唯一值的token@SuppressWarnings("unchecked")public synchronized static String generateGUID(HttpSession session) {String token = "";try {Object obj = session.getAttribute("SPRINGMVC.TOKEN");if(obj!=null)springmvc_token = (Map<String,String>)session.getAttribute("SPRINGMVC.TOKEN");token = new BigInteger(165, new Random()).toString(36).toUpperCase();springmvc_token.put(Constants.DEFAULT_TOKEN_NAME + "." + token,token);session.setAttribute("SPRINGMVC.TOKEN", springmvc_token);Constants.TOKEN_VALUE = token;} catch (IllegalStateException e) {logger.error("generateGUID() mothod find bug,by token session...");}return token;}//验证表单token值和session中的token值是否一致@SuppressWarnings("unchecked")public static boolean validToken(HttpServletRequest request) {String inputToken = getInputToken(request);if (inputToken == null) {logger.warn("token is not valid!inputToken is NULL");return false;}HttpSession session = request.getSession();Map<String, String> tokenMap = (Map<String, String>) session.getAttribute("SPRINGMVC.TOKEN");if (tokenMap == null || tokenMap.size() < 1) {logger.warn("token is not valid!sessionToken is NULL");return false;}String sessionToken = tokenMap.get(Constants.DEFAULT_TOKEN_NAME + "."+ inputToken);if (!inputToken.equals(sessionToken)) {logger.warn("token is not valid!inputToken='" + inputToken+ "',sessionToken = '" + sessionToken + "'");return false;}tokenMap.remove(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);session.setAttribute("SPRINGMVC.TOKEN", tokenMap);return true;}//获取表单中token值@SuppressWarnings("unchecked")public static String getInputToken(HttpServletRequest request) {Map params = request.getParameterMap();if (!params.containsKey(Constants.DEFAULT_TOKEN_NAME)) {logger.warn("Could not find token name in params.");return null;}String[] tokens = (String[]) (String[]) params.get(Constants.DEFAULT_TOKEN_NAME);if ((tokens == null) || (tokens.length < 1)) {logger.warn("Got a null or empty token name.");return null;}return tokens[0];}
二: 自己实现一个自定义标签 这里我自定义的标签叫: <dy:token/> 页面中使用如下:
1:引入标签库:<%@ taglib prefix="dy" uri="/dy-tags"%>
2:jsp页面中的表单,注意加上token标签!!!如下:
index.jsp!!!
<%@ taglib prefix="dy" uri="/dy-tags"%>
<html><head><title>spring mvc</title></head><body> welcome to spring mvc!<br/><form name="mvcForm" action="indexSubmit.do" method="post"><dy:token/>username: <input name="username" type="text" value="${user.username}"/>password: <input name="password" type="text" value="${user.password}"/>email: <input name="email" type="text" value="${user.email}"/><input type="submit" value="提交"></form></body>
</html>
三 :这是我用到的常量:
public static String DEFAULT_TOKEN_MSG_JSP = "unSubmit.jsp" ;
public static String TOKEN_VALUE ;
public static String DEFAULT_TOKEN_NAME = "springMVC.token";
四: 我MyController类的以下2个方法要用到token,防止表单重复提交
@RequestMapping(value = "index.do")public String index(HttpServletRequest request) {return "index";}
@RequestMapping(value = "indexSubmit.do", method = RequestMethod.POST)public String indexSubmit(User user,HttpServletRequest request) {try {myService.insert(user);logger.info("info=新增成功");} catch (Exception e) {logger.error("exception:" + e);}
五:以下是我拦截器的实现,注意有两个拦截器,一个生成token,一个验证token。
/*** @Title* @author dengyang* @date 2013-6-4*/
public class TokenHandlerInterceptor implements HandlerInterceptor{public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {}public void postHandle(HttpServletRequest request, HttpServletResponse response,Object arg2, ModelAndView arg3) throws Exception {TokenHandler.generateGUID(request.getSession());}public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {return true;}
}
/*** @Title* @author dengyang* @date 2013-6-4*/
public class TokenValidInterceptor implements HandlerInterceptor{public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object arg2, Exception arg3)throws Exception {}public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception {}public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {if(!TokenHandler.validToken(request)){response.sendRedirect(Constants.DEFAULT_TOKEN_MSG_JSP);return false;}return true;}
}
六:这下面是spring拦截器配置:
<mvc:interceptor><mvc:mapping path="/index.do" />-->这个请求返回的是你有token的页面<bean class="com.dengyang.interceptor.TokenHandlerInterceptor" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/indexSubmit.do" />-->这个是提交请求<bean class="com.dengyang.interceptor.TokenValidInterceptor" /></mvc:interceptor>
转载于:https://blog.51cto.com/6230217/1244757
SpringMVC中实现的token,防表单重复提交相关推荐
- JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体
1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...
- python表单防重复提交_关于PHP使用token防止表单重复提交的方法
这篇文章主要介绍了PHP使用token防止表单重复提交的方法,通过生成一个加密后的随机数存入session的token变量,同时将该值放入表单隐藏提交,达到防止表单重复提交的功能,需要的朋友可以参考下 ...
- redis防表单重复提交
参考链接: 防表单重复提交的四种方法:https://www.cnblogs.com/huanghuizhou/p/9153837.html 补充几点个人想法: 1. 对于前后端传递token验证的方 ...
- php token 表单重复提交,PHP生成token防止表单重复提交2个例子
防止表单重复提交的解决方案非常的简单,我们下面两个例子都是生成一个随机的token验证用户是不是由我们站内提交并且进行重复验证即可实现了. 在网上搜索了一下有很多站长都这样说的 1.提交按钮置disa ...
- validate中submitHandler采用ajaxsubmit导致表单重复提交
validate中submitHandler采用ajaxsubmit导致表单重复提交 在这几日的表单验证实践中,由于我的三个form都放在一个页面上,所以在submit上采用的是ajax方式来提交表单 ...
- Spring Boot中防表单重复提交以及拦截器登录检测
目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...
- struts2 自带的 token防止表单重复提交拦截器
在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加: <interceptor-ref name=&quo ...
- token防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- 基于拦截器实现防表单重复提交
1.定义自定义注解 2.定义防重复提交拦截器 /*** 防止重复提交拦截器** */ @Component public abstract class RepeatSubmitInterceptor ...
最新文章
- Python中获取异常(try Exception)信息
- 常用作图与图片处理工具
- linux下汇编实例
- 处理Request 的方法中的形参务必加上@RequestParam 注解
- Ajax-基础篇(02)
- python官方的扩展索引_Python列表操作与深浅拷贝(6)——列表索引、查询、修改、扩展...
- 电脑鸿蒙运行Linux程序,Linux下的Hi3861一站式鸿蒙开发烧录(附工具)-鸿蒙开发烧录工具软件电脑版-东坡下载...
- oracle免费云攻略,使用免费的Oracle云服务-创建云主机
- JEECG - 基于代码生成器的J2EE智能开发框架 续二: 代码生成器使用规则
- python存文件代码_Python文件读写保存操作的示例代码
- Kubernetes 常见运维技巧总结
- Property “pageNumber“ was accessed during render but is not defined on instance.
- 中国成品油价为啥会比美国贵30%?
- uniapp-mixpanel用户行为分析埋点统计插件
- CSDN学霸课表——把Word的默认背景颜色由白色改为绿色
- 哈工大2019年春算法设计与分析期末复习
- JavaWeb - 软件开发的流程,综合案例
- XML文件怎么添加注释
- 计算机网络实验:实验三 路由器的基本配置
- 飞信短信接口php,用PHP实现飞信api接口发飞信短信