Struts2 Struts 2使用tokenSession拦截器在提交后无法获取表单值

Struts2 Struts 2使用tokenSession拦截器在提交后无法获取表单值,struts2,token,Struts2,Token,我有以下登录和安全登录的简单代码。对于安全登录,我在表单提交时使用tokenSession拦截器。在success.jsp中,如果我提交secureLogin,我无法获得userId值,但登录没有问题。有谁能帮我解释一下这背后的原因吗 <%@ taglib prefix="s" uri="/struts-tags" %> <html> <body><LOGIN.JSP> <s:form action="login" > <

我有以下登录和安全登录的简单代码。对于安全登录,我在表单提交时使用tokenSession拦截器。在success.jsp中,如果我提交secureLogin,我无法获得userId值,但登录没有问题。有谁能帮我解释一下这背后的原因吗

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
 <body><LOGIN.JSP>
  <s:form action="login" >
  <s:textfield name="userId" label="Login Id"/><br>
  <s:password name="password" label="Password"/><br>
     <s:submit value="Login" align="center"/>
 </s:form>
  <s:form action="secureLogin" >
  <s:textfield name="userId" label="Login Id"/><br>
  <s:password name="password" label="Password"/><br>
  <s:token />
     <s:submit value="secureLogin" align="center"/>
  </s:form>
 </body>
</html>



<struts>
  <package name="default" extends="struts-default">
     <interceptors>
       <interceptor name="tokenSession" class = "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
       </interceptors>
   <global-results>
       <result name="invalid.token">/error.jsp</result>
    </global-results>
   <action name="secureLogin" class="com.actions.HelloAction" method="secureLogin">
     <result name="success">/success.jsp</result>
     <result name="failure">/login.jsp</result>
     <interceptor-ref name="tokenSession" />
   </action>
   <action name="login" class="com.actions.HelloAction" method="login">
      <result name="success">/success.jsp</result>
      <result name="failure">/login.jsp</result>
   </action>
   </package>   
 </struts>


  package com.actions;

  public class HelloAction {
    private String userId;
    private String password;

    public String execute() {
    return "success";
    }

   public String login(){
    return "success";
   }

   public String secureLogin(){
    return "success";
   }

   public String getUserId() {
    return userId;
   }

   public void setUserId(String userId) {
    this.userId = userId;
   }

   public String getPassword() {
    return password;
   }

   public void setPassword(String password) {
    this.password = password;
   }

     }


  <%@ taglib prefix="s" uri="/struts-tags" %>

 <html>
 <head>
       <title>SUCCESS.JSP</title>
 </head>
  <body>

   Welcome <b><s:property value="userId"/></b> , you have loged  in. <br />
          </body>
 </html>





/error.jsp /success.jsp /login.jsp /success.jsp /login.jsp 包com.actions; 公共类HelloAction{ 私有字符串用户标识; 私有字符串密码; 公共字符串execute(){ 返回“成功”; } 公共字符串登录(){ 返回“成功”; } 公共字符串secureLogin(){ 返回“成功”; } 公共字符串getUserId(){ 返回用户标识; } public void setUserId(字符串userId){ this.userId=userId; } 公共字符串getPassword(){ 返回密码; } public void setPassword(字符串密码){ this.password=密码; } } SUCCESS.JSP 欢迎,您已登录

您需要一个
拦截器堆栈

<struts>
  <package name="default" extends="struts-default">
     <interceptors>
       <interceptor name="tokenSession" class = "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
       <interceptor-stack name="yourStack">
          <interceptor-ref name="defaultStack"/>
          <interceptor-ref name="tokenSession"></interceptor-ref>
       </interceptor-stack>
       </interceptors>
       <default-interceptor-ref name="yourStack"/>
       <global-results>
           <result name="invalid.token">/error.jsp</result>
        </global-results>
   </package>   
 </struts>

/error.jsp

这里有一个链接:

如果您为某个操作声明任何拦截器,则必须为该操作声明所有拦截器。您不一定需要显式堆栈,尽管如果经常使用,这会很方便。