Struts1.x 解决页面重复提交时用的是token机制,在打开一个表单编辑保存的情况下,工作的很好。但是如果同时打开若干表单,编辑并保存,结果会令人失望,只有最后打开的那个表单工作正常,用户一定很郁闷!总不能告诉用户,一次只打开一个吧,呵呵
最近用户反应这个问题,认为是很严重的bug,没办法,只好去解决。Struts的token机制就不用解释了,下面说一下解决办法:
1、修改org.apache.struts.util.TokenProcessor类
java 代码
- public synchronized boolean isTokenValid(
- HttpServletRequest request,
- boolean reset) {
- // Retrieve the current session for this request
- HttpSession session = request.getSession(false);
- if (session == null) {
- return false;
- }
- // Retrieve the transaction token from this session, and
- // reset it if requested
- String uuid = request.getParameter("UUID");
- String saved = (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY+uuid);
- if (saved == null) {
- return false;
- }
- if (reset) {
- this.resetToken(request);
- }
- // Retrieve the transaction token included in this request
- String token = request.getParameter(Constants.TOKEN_KEY);
- if (token == null) {
- return false;
- }
- return saved.equals(token);
- }
- public synchronized void resetToken(HttpServletRequest request) {
- HttpSession session = request.getSession(false);
- if (session == null) {
- return;
- }
- String uuid = request.getParameter("UUID");
- session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY+uuid);
- }
- public synchronized void saveToken(HttpServletRequest request) {
- HttpSession session = request.getSession();
- String token = generateToken(request);
- if (token != null) {
- String uuid = UUID.create();
- session.setAttribute(Globals.TRANSACTION_TOKEN_KEY+ uuid, token);
- request.setAttribute("UUID",uuid);
- }
- }
2、修改org.apache.struts.taglib.html.FormTag
java 代码
- protected String renderToken() {
- StringBuffer results = new StringBuffer();
- HttpSession session = pageContext.getSession();
- if (session != null) {
- String uuid = (String)pageContext.getRequest().getAttribute("UUID");
- String token =(String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY+uuid);
- if (token != null) {
- results.append(");
- results.append(Constants.TOKEN_KEY);
- results.append("\" value=\"");
- results.append(token);
- if (this.isXhtml()) {
- results.append("\" />");
- } else {
- results.append("\">");
- }
- results.append(");
- results.append(" value=\"");
- results.append(uuid);
- if (this.isXhtml()) {
- results.append("\" />");
- } else {
- results.append("\">");
- }
- }
- }
- return results.toString();
- }
(备注:UUID类是一个工具类,用于生成一个唯一字符串序列,你可以自己替换)
3、编译并替换struts.jar中的相关class,测试一下,可以同时打开多个表单了