SpringMVC token 防止表单重复提交,加上注释,帮助理解
2016-09-10 14:34
441 查看
package com.framework.plugin.token; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.ElementType; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Token { boolean save() default false; boolean remove() default false; }
package com.framework.plugin.token; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; import java.util.UUID; public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Token annotation = method.getAnnotation(Token.class); //判断是否有标注 if (annotation != null) { boolean needSaveSession = annotation.save(); if (needSaveSession) { //生成uuid随机token,反射到jsp request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); //saveentity方法触发 if (needRemoveSession) { if (isRepeatSubmit(request)) { return false; } //防止下一次进入,去掉token, request.getSession(false).removeAttribute("token"); } } return true; } else { return super.preHandle(request, response, handler); } } /** * 判断是否重复点击 * @author 李品良 *创建时间:2016年9月10日 下午2:26:05 * @param request * @return */ private boolean isRepeatSubmit(HttpServletRequest request) { //那么下一次,这个方法就失败了. String serverToken = (String) request.getSession(false).getAttribute("token"); if (serverToken == null) { return true; } String clinetToken = request.getParameter("token"); if (clinetToken == null) { return true; } if (!serverToken.equals(clinetToken)) { return true; } return false; } }
<!-- token拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.framework.plugin.token.TokenInterceptor" /> </mvc:interceptor> </mvc:interceptors>
jsp要加上
<input type="hidden" name="token" value="${token}"/>
controllor 加上
/**
* 跳转到新增界面
*
* @return
*/
@RequestMapping("addUI")
@Token(save = true)
public String addUI(Model model) {
return Common.BACKGROUND_PATH + "/system/producttree/add";
}
/**
* 添加菜单
*
* @param producttree
* @return Map
* @throws Exception
*/
@RequestMapping("addEntity")
@ResponseBody
@Token(remove = true)
@Transactional(readOnly = false) // 需要事务操作必须加入此注解
@SystemLog(module = "系统管理", methods = "产品管理-新增产品") // 凡需要处理业务逻辑的.都需要记录操作日志
public String addEntity() throws Exception {
ProductTreeFormMap productTreeFormMap = getFormMap(ProductTreeFormMap.class);
productTreeFormMap.save();
return "success";
}
相关文章推荐
- 【spring mvc】springmvc中自己实现的token防表单重复提交,防止二次提交(二)
- springmvc中自己实现的token防表单重复提交,防止二次提交
- SpringMVC token 防止表单重复提交
- 重新理解了重定向,利用重定向可以防止用户重复提交表单(兼谈springmvc重定向操作)
- springmvc中自己实现的token防表单重复提交,防止二次提交
- springMVC中基于token防止表单重复提交
- springmvc中自己实现的token防表单重复提交,防止二次提交
- springmvc中使用token来防止表单重复提交
- springMVC中基于token防止表单重复提交方法
- THINKPHP 防止重复提交表单 自己实现token
- SpringMVC中实现的token,防表单重复提交
- JAVA防止表单重复提交(SpringMVC,ICache)
- struts2利用token和tokenSession实现防止表单重复提交的具体代码
- Java 使用Token令牌防止表单重复提交
- Struts2 <s:token>防止表单重复提交 %{}
- struts2_大纲09_token防止表单重复提交
- struts2中t使用token防止重复提交表单
- 拦截器springmvc防止表单重复提交【1】
- Struts2学习10--防止表单的重复提交token标签和tokenSession
- springmvc 防止表单重复提交