最近在做防止重复提交的功能,用到了令牌。在匹配成功之后会将session的token删掉,但是由于在action里面封装了公司框架的方法,执行完业务逻辑类后会有跳转,跳转也是同一个action,回到action后请求的token值还存在,在去匹配导致匹配不到,所以报重复提交操作了。现在想的办法就是,在清除session里保存的token时同时清除requset里token的值,但是不起作用,清除不掉。在处理业务逻辑跳转时请求的token还在,有没什么方法在一次请求完时,清掉token这个变量的值?代码如下:
Token比较代码public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
boolean valid = false;
if(CommUtil.isBlank(tokenStr))
valid=true;
if(session != null){
ArrayList tokenList = getTokenList(session);
if (tokenList.contains(tokenStr)) {
valid = true;
tokenList.remove(tokenStr);
}
}
return valid;
}action处理代码:
public ActionForward executeAct(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
String token=req.getParameter("token");
logger.debug("----------token:"+token);
if(!Token.isTokenStringValid(token, req.getSession())){
//进行防重复提交处理流程 非法操作,请勿重复提交!
System.out.println("---------------重复提交");
saveErrors(req, ErrMsg.getActionError(new AppException("resubmit")));
return mapping.findForward("failure");
}
//此处是框架封装的方法,业务逻辑统一放到这里去操作,然后返回 forward进行跳转
//forward里有调用其它逻辑类的方法。
Dto returnVO = bo.exec(topicName, funcName, aDto, stBean);
LazyDynaBean returnBean = new LazyDynaBean();
DtoUtil.copyPropertys(returnBean, returnVO);
try {
BeanUtils.copyProperties(execForm, returnBean);
} catch(Exception ee){}
req.setAttribute("returnBean", returnBean);
req.setAttribute("returnDto", returnVO);
req.setAttribute("gctBean", returnVO);
String output_forward = ForwardUtil.getOutputForward(returnVO, execForm, topic_func_bean, null);
String append_url = null;
append_url = GctUtilNew.getKeyUrl(topicBean, returnVO);
ActionForward actionforward = ForwardUtil.createForward(bo, mapping, output_forward, append_url, false);
return actionforward;
}网上查过HttpServletRequestWrapper,但不知怎么实现!
请问大大们这个有什么好的解决办法没!多谢删除request
Token比较代码public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
boolean valid = false;
if(CommUtil.isBlank(tokenStr))
valid=true;
if(session != null){
ArrayList tokenList = getTokenList(session);
if (tokenList.contains(tokenStr)) {
valid = true;
tokenList.remove(tokenStr);
}
}
return valid;
}action处理代码:
public ActionForward executeAct(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
String token=req.getParameter("token");
logger.debug("----------token:"+token);
if(!Token.isTokenStringValid(token, req.getSession())){
//进行防重复提交处理流程 非法操作,请勿重复提交!
System.out.println("---------------重复提交");
saveErrors(req, ErrMsg.getActionError(new AppException("resubmit")));
return mapping.findForward("failure");
}
//此处是框架封装的方法,业务逻辑统一放到这里去操作,然后返回 forward进行跳转
//forward里有调用其它逻辑类的方法。
Dto returnVO = bo.exec(topicName, funcName, aDto, stBean);
LazyDynaBean returnBean = new LazyDynaBean();
DtoUtil.copyPropertys(returnBean, returnVO);
try {
BeanUtils.copyProperties(execForm, returnBean);
} catch(Exception ee){}
req.setAttribute("returnBean", returnBean);
req.setAttribute("returnDto", returnVO);
req.setAttribute("gctBean", returnVO);
String output_forward = ForwardUtil.getOutputForward(returnVO, execForm, topic_func_bean, null);
String append_url = null;
append_url = GctUtilNew.getKeyUrl(topicBean, returnVO);
ActionForward actionforward = ForwardUtil.createForward(bo, mapping, output_forward, append_url, false);
return actionforward;
}网上查过HttpServletRequestWrapper,但不知怎么实现!
请问大大们这个有什么好的解决办法没!多谢删除request
解决方案 »
- 页面中有两个Frame,怎么在一个Frame中提交按钮后就会刷新另一个Frame的页面,不用更新数据库中的信息??
- spring,ibatis问题
- 下拉框内容填充方法讨论
- tomcat怎么控制应用的路径以及读取指定的web-inf信息
- 如果获取outlook calendar中的数据信息,用JAVA实现
- 导出数据到Excel问题
- 请问怎么配置Struts
- 在一个web project中如何建立一个web service
- jsp论坛不断刷新用什么代码?
- 第一次上网求助 在线等关于获取webligoc连接池的问题
- 项目部署不到tomcat上面
- java poi 取得合并单元格并设置其值,以及设置边框
页面连接:/gct.do?method=executeAct&token=822385913941&xxxxxxxx
跳入action根据xxxx执行不同的业务逻辑类
业务逻辑类处理完成,在跳转到其它页面/gct.do?method=executeAct&xxxxxxxx
但此时request里请求的token还存在,走到executeAct方法时,验证令牌报重复提交(在第一次进入验证时通过,删掉session的token,第二次匹配不到)
//清空params
req.getParameterMap().clear();
页面连接:/gct.do?method=executeAct&token=822385913941&xxxxxxxx
获取token,验证重复提交,验证通过,清除session存放的token值
根据参数xxxx执行不同的业务逻辑类
业务逻辑类处理完成,在返回到其它页面 forward url=/gct.do?method=executeAct&xxxxxxxx
页面第二次进入executeAct时
request里请求的token还存在,验证令牌报重复提交(在第一次进入验证时通过,删掉session的token,第二次匹配不到)
这样不就清空所有的请求了吗?
我要做的就是删除特定的一个变量的值。
req.getParameterMap().remove(key);
这样不就清空所有的请求了吗?
我要做的就是删除特定的一个变量的值。
req.getParameterMap().remove(key);
这样之前已经试过,getParameterMap是锁住的
locked ParameterMap
异常是locked ParameterMap
这样不就清空所有的请求了吗?
我要做的就是删除特定的一个变量的值。
req.getParameterMap().remove(key);
这样之前已经试过,getParameterMap是锁住的
locked ParameterMap
那把你要保存的值先取出来,map清空了再保存进去。
如果这个没办法只能用redirect了
这样不就清空所有的请求了吗?
我要做的就是删除特定的一个变量的值。
req.getParameterMap().remove(key);
这样之前已经试过,getParameterMap是锁住的
locked ParameterMap
那把你要保存的值先取出来,map清空了再保存进去。
如果这个没办法只能用redirect了
系统里这个redirect都是false,不能调整这个属性。
因为这是个公共的action,不能获取到底是哪些值,没办法情况