Struts 1.X重複コミットの解決
フォームの記入が完了するたびに「発行」をクリックすると、strutsでactionが関連するビジネスロジックを実行し、forwardオブジェクトを介してページに移動します.このときページをリフレッシュすると、同じ論理が実行されます.たとえば、データベースにデータを記録すると、上記の場合、データベースに同じデータが2つあります.このような状況を避けるために、いくつかの解決策があります.
1:ビジネスロジックを実行した後、Forwardオブジェクトを返します.このforwardオブジェクトのpathプロパティは、べき乗などのXXX.do操作を構成する必要があります.これにより解決できますが、ユーザーの要求に合わない可能性があります.他の方法があります.
2:リダイレクト、プロファイル内でredirectプロパティ
3:struts 1.xトークンを使用すると、このような問題をうまく解決できます.
必要条件:フォーム内でstrutsのライブラリラベル(
LoginAction:
package com.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
public class LoginAction extends DispatchAction {
public ActionForward get(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// ( jsp 32 jsessionid)\
this.saveToken(request);
System.out.println("begin save");
return mapping.findForward("login");
}
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
/**//*if(this.isTokenValid(request))
{
System.out.println("valid");
this.resetToken(request);
return mapping.findForward("ok");
}*/
//
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
else
{
System.out.println("invalid");
return mapping.findForward("error");
}
}
}
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans>
<form-bean name="loginForm" type="com.web.form.LoginForm"></form-bean>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action path="/login" parameter="method" name="loginForm"
type="com.web.action.LoginAction">
<forward name="login" path="/login.jsp" />
<forward name="ok" path="/ok.jsp" />
<forward name="error" path="/error.jsp" />
</action>
</action-mappings>
<message-resources parameter="" />
</struts-config>
index.jsp:
<% @page contentType="text/html; charset=GBK"%>
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<a href="${ctx}/login.do?method=get"> </a>
</body>
</html>
login.jsp:
<% @page contentType="text/html; charset=GBK"%>
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<% @taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!-- html , token -->
<html:form action="login.do?method=login" method="post">
<html:submit value=" "></html:submit>
</html:form>
</body>
</html>
, " ".
login.jsp :
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<form name="loginForm" method="post" action="/strutsToken/login.do?method=login">
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
<input type="submit" value=" ">
</form>
</body>
</html>
login.jsp :
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
32 JsessionID .
LoginAction get saveToken(request) .
jsessionid request .
:
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
, login.jsp jsessionid request
, , .
. .
, jsessionid( ),
, , .
.
, action : , ,add() insert(), add , insert , 。