java 防重_防重提交-开发思路

该博客介绍了一个基于Spring MVC的TokenInterceptor实现,用于防止HTTP请求的重复提交。通过在HandlerInterceptor中检查请求的Token,确保每个新增操作都有唯一的Token,并在提交时验证表单Token与Session中Token的匹配性,若不匹配则重定向到指定页面。此外,还处理了Token池的存储和清理,避免不同功能间的Token覆盖问题。
摘要由CSDN通过智能技术生成

importjava.util.ArrayList;importjava.util.List;importjava.util.UUID;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importorg.chu.annotation.TokenForm;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;/*** 防重提交

*@authorranger

**/

public class TokenInterceptor implementsHandlerInterceptor {

@SuppressWarnings("unchecked")

@Overridepublic booleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException {//第一步:如果是一个增加的请求,我们就创建一个Token//问题:如何标志请求的方法是一个增加的方法呢?通过注解来标识//HandlerMethod对象可以获得请求准备要调用的方法的方法信息

List tokenPool=null;

HandlerMethod hm=(HandlerMethod) handler;

TokenForm tokenForm= hm.getMethodAnnotation(TokenForm.class);if (tokenForm!=null) {

HttpSession session=request.getSession();//问题:如果多个功能使用的SessionToken是同一个。会出现相互覆盖的情况//解决方案,使用一个集合来存储sessionToken。将Token分为当前Token (用于返回到页面),Token池

if (session.getAttribute("tokenPool")==null) {

tokenPool=new ArrayList<>();

}else{

tokenPool=(List) session.getAttribute("tokenPool");

}//只要,进入或者提交都要出境一个新的Token放在Session里面

String sessionToken =UUID.randomUUID().toString();//将创建的Token放在会话的tokenPool里面

tokenPool.add(sessionToken);//将创建的Token放在会话方放在一个字段里面用于返回到页面

session.setAttribute("sessionToken", sessionToken);

session.setAttribute("tokenPool", tokenPool);//remove为true,表示是一个提交增加的请求

if(tokenForm.remove()) {//判断请求表单的token和会话里面的Token是否相同

String formToken = request.getParameter("formToken");

List resultTokenPool = (List) session.getAttribute("tokenPool");boolean flag=false;for(String token : resultTokenPool) {if(token.equals(formToken)) {//如果发现token池有对应的Token就移除

resultTokenPool.remove(token);

flag=true;break;

}

}//如果表单的Token在Token池里面没有。就跳转到指定的页面

if (flag==false) {

response.sendRedirect(request.getParameter("token.invoke"));return false;

}

}

}return true;

}

@Overridepublic voidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView)throwsException {

}

@Overridepublic voidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throwsException {

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值