2013-09-16 6 views
4

Я попытался реализовать токен-перехватчик с тегом <s:url .., но его отображающая ошибка при первом щелчке. т.е. The form has already been processed or no token was supplied, please try again.Невозможно реализовать перехватчик токенов Struts 2 с гиперссылкой

Я хочу реализовать этот перехватчик, потому что, если пользователи уже удалил строку и обновить страницу еще раз то же самое действие не должно выполнить еще раз.

<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> 
+0

Просто сделайте перенаправление после публикации. См. Http://en.wikipedia.org/wiki/Post/Redirect/Get и http://struts.apache.org/development/2.x/docs/redirect-after-post.html. –

+0

@AleksandrM ранее я перенаправлял, но при перенаправлении я освободил '' при переадресации. – beginner

+0

Для хранения сообщений о действиях есть перехватчик 'store': http://struts.apache.org/development/2.x/docs/message-store-interceptor.html. –

ответ

4

В s: маркер тег просто помещают скрытый элемент, содержащий уникального маркера.

Не нужно использовать токен с URL-адресом, так как форма должна быть отправлена. Если вы хотите передать некоторый токен в качестве параметра, вам нужно использовать тег 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> 
+0

Как? вы имели в виду, что мне нужно использовать '' вместо ''? , а затем остальные мои коды. здесь '23424223' - это уникальный номер. – beginner

+0

Токены реализованы как «скрытые» поля, которые содержат значение уникального токена. Он передается как параметр при отправке формы. если вы не отправляете его, struts2 может не получить его в качестве параметра. –

+1

Можете ли вы изменить мой код выше и реализовать его с помощью 's: param ..'? как вы сказали, позвольте мне посмотреть, просмотрев ваши обновления для полного понимания. – beginner

3

Самый простой способ использовать маркер с URL, чтобы использовать <s:token/> тег, чтобы установить значение маркера в сессии и получить его в <s:param> теге ,

<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> 
+0

Спасибо, теперь я понял, как использовать токен с ' beginner

+0

@ user2732367: И с этим решением нет необходимости определять «специальный» метод токена в каждом классе действий. –

+1

Я пропустил это, приятно –

Смежные вопросы