我从浏览器收到以下错误“当显示此页面时,Firefox将重复之前执行的任何操作”,当用户单击F5并再次提交表单时。我尝试使用POST REDIRECT GET但面临问题。
以下是我的代码: 我的原始代码是
<action name="update-test" class="testAction" method="test">
<result name="success">/test/xyz/test-result.jsp</result>
</action>
<action name="update-test" class="testAction" method="test">
<result name="success" type="redirectAction">forward-test</result>
</action>
<action name="forward-test" class="testAction" method="forward">
<result name="success">/test/xyz/test-result.jsp</result>
</action>
Apr 26, 2014 4:12:02 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException at org.apache.jsp.portal.tiles.tickets.tests_002test_002dresult_002dv1_jsp._jspService(tests_0 02dtest_002dresult_002dv1_jsp.java:196)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
当我在第196行做了一个观察源时,我看到了以下内容。
<div id="tabXYZ" class="panel">
<img src="/images/arrow_mainmenu.jpg" width="25" height="31" alt="" class="floatingleft">
这是我的整个文件。 test_result.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ page import="com.ubizen.og.reportcenter.site.StandardCollectionKeys"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<tiles:insertTemplate template="/test/templates/testTemplate.jsp">
<% pageContext.setAttribute("selectedModule", session.getAttribute(StandardCollectionKeys.SELECTED_MODULE)); %>
<tiles:putAttribute name="header" type="string"><s:property value="#attr.selectedModule.label"/></tiles:putAttribute>
<tiles:putAttribute name="body" value="/test/tiles/test/test-inspect-result-v1.jsp"/>
<tiles:putAttribute name="showTopLink" value="true" type="string"/>
</tiles:insertTemplate>
答案 0 :(得分:2)
在Struts2中防止在刷新时重新提交表单的最佳方法是使用token
拦截器或tokenSession
拦截器。
使用token
拦截器在表单中添加<s:token>
标记,如下所示。
<s:form action="yourAction" method="post">
<s:token/>
//your parameters or form fields
</s:form>
在重新提交表单时使用token
拦截器,您可以将用户重定向到您想要的页面(例如/invalid_token.jsp
),如下所示。
struts.xml
token
拦截器的配置如下
<action name="yourAction" class="com.YourActionClass">
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/update.jsp</result>
<result name="invalid.token">/invalid_token.jsp</result>
</action>
如果您希望在刷新或重新提交表单时向用户显示上一个操作的结果页面而不再次调用操作,则可以使用tokenSession
拦截器。
struts.xml
tokenSession
拦截器的配置如下
<action name="yourAction" class="com.YourActionClass">
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/update.jsp</result>
</action>
希望这会对你有所帮助。