我正在尝试通过在会话中设置仅使用一次令牌并将其与请求进行比较来阻止由浏览器刷新引起的多个表单提交。但是,当我尝试重置会话令牌时,它没有得到更新。以下是我的代码。
设置呈现jsp页面的令牌
getSession().setAttribute(Globals.TRANSACTION_TOKEN_KEY, "123");
这是我的jsp
<s:hidden name="token" value="123"/>
动作类
String requestToken = getToken();
String sessionToken = (String)
getRequest().getSession().getAttribute(Globals.TRANSACTION_TOKEN_KEY);
if(requestToken.equalsIgnoreCase(sessionToken)){
//reset the token
getRequest().getSession().setAttribute(Globals.TRANSACTION_TOKEN_KEY, "124");
//perform update
}
会话令牌未更新为124.请协助。
谢谢, Prasheel。
答案 0 :(得分:0)
您可以使用以下代码。
加载上一页
ActionContext.getContext().getSession().put(Globals.TRANSACTION_TOKEN_KEY, "123");
在jsp页面
<s:hidden name="token" value="123"/>
在表单提交的动作类中
Map<String,Object> session = ActionContext.getContext().getSession();
if(getToken().toString().equalsIgnoreCase(session.get(Globals.TRANSACTION_TOKEN_KEY).toString())){
System.out.println("request is handled");
//reset the token
//perform update
session.put(Globals.TRANSACTION_TOKEN_KEY, "124");
}
在两个jsp页面中都使用此
< %
response.setHeader("Cache-Control", "no-cache, no-store");
response.setDateHeader("Expires", 0);
response.setHeader("Vary", "*");
% >
简单的方法是
if (session.getAttribute("recordInsertedSuccessfully") == null )
{
//update records
//after inserting into the database we should do :
session.putAttribute("recordInsertedSuccessfully","true");
} else {
//case of form re-submission
}
您的问题是您再次调用将会话变量设置为123的方法。
制作另一种方法runinspect2()
,从runinspect()
复制粘贴代码,但从runinspect2()
删除将会话变量设置为123的行
ActionContext.getContext().getSession().put(Globals.TRANSACTION_TOKEN_KEY, "123");
并在runinspect2()
方法中调用update()
,这很简单