【问题标题】:Unable to implement Struts 2 token interceptor with hyperlink无法使用超链接实现 Struts 2 令牌拦截器
【发布时间】:2013-09-20 06:04:52
【问题描述】:

我尝试使用<s:url .. 标签实现令牌拦截器,但它在第一次点击时显示错误。即

表单已处理或未提供令牌,请重试。

我想实现这个拦截器,因为如果用户已经删除了一行并再次刷新页面,那么同样的动作不应该再次执行。

<s:url id="linkdelete" action="DeleteLatestUpload.action" namespace="/admin/insecure/upload">
     <s:param name="latestUploadId" value="latestUploadId"></s:param>
     <s:token name="token"></s:token>
</s:url> 
<a href='<s:property value="#linkdelete"/>' style="color: white;text-decoration:  none;" class="delbuttonlink">Clear current Uploads</a>

还有我的struts.xml

 <action name="DeleteLatestUpload" class="v.esoft.actions.UploadExcel" method="deleteUploads">                   
     <interceptor-ref name="token"></interceptor-ref>
     <interceptor-ref name="basicStack"></interceptor-ref>  
     <result name="success" type="tiles"> uploadforward</result>
     <result name="invalid.token" type="tiles">uploadforward </result>
 </action>
            

【问题讨论】:

标签: java jsp struts2 token interceptor


【解决方案1】:

将token与url一起使用最简单的方法是使用&lt;s:token/&gt;标签将token值设置到会话中并在&lt;s:param&gt;标签中检索它。

<s:token/>

<s:url var="..." action="...">
  <s:param name="struts.token.name" value="'token'"/>
  <s:param name="token" value="#session['struts.tokens.token']"/>
</s:url>

【讨论】:

  • @user2732367:使用此解决方案,无需在每个操作类中定义“特殊”标记方法。
【解决方案2】:

s:token 标签只是放置一个隐藏元素,其中包含 唯一的令牌。

url不需要使用token,因为需要提交表单。如果你想传递一些令牌作为参数,那么你需要使用s:param 标签。

定义参数

  private String token;

  public String getToken() {
    return token;
  }

  public void setToken(String token) {
    this.token = token;
  }

  public String execute() throws Exception {
    Map<String, Object> context = ActionContext.getContext().getValueStack().getContext();
    Object myToken = context.get("token");
    if (myToken == null) {
        myToken = TokenHelper.setToken("token");
        context.put("token", myToken);
    }
    token = myToken.toString();
    return SUCCESS;
  }

在 JSP 中

<s:url var="linkdelete" namespace="/admin/insecure/upload" action="DeleteLatestUpload" ><s:param name="struts.token.name" value="%{'token'}"/><s:param name="token" value="%{token}"/></s:url>

【讨论】:

  • 怎么样?你的意思是,我必须使用&lt;s:param name="token" value="23424223"&gt;&lt;/s:param&gt; 而不是&lt;s:token name="token"&gt;&lt;/s:token&gt;? ,然后是我上面的其余代码。这里23424223 是一个唯一的数字。
  • 令牌实现为 hidden 字段,其中包含唯一令牌的值。它在您提交表单时作为参数传递。如果不提交,struts2 可能无法将其作为参数获取。
  • 你能修改我上面的代码并用s:param .. 实现它吗?正如你所说,让我看看你的更新以充分理解。
  • 感谢您的支持,虽然我没有测试过您的代码,但它看起来很酷。在用我的应用测试和实现这段代码后,我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多