java - No se puede implementar el interceptor de token Struts 2 con hipervínculo
jsp struts2 (2)
Intenté implementar token interceptor con la etiqueta <s:url ..
pero muestra el error en el primer clic. es decir, The form has already been processed or no token was supplied, please try again.
Quiero implementar este interceptor, porque si los usuarios ya eliminaron una fila y actualizaron la página una vez más, la misma acción no debería volver a realizarse.
<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>
y mi 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>
La etiqueta s: token simplemente coloca un elemento oculto que contiene el token único.
No es necesario usar token con url, porque el formulario debe enviarse. Si quiere pasar un token como parámetro, entonces necesita usar s:param
etiqueta s:param
.
Definir el parámetro
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;
}
en el 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>
La forma más simple de usar token con url es usar la etiqueta <s:token/>
para establecer el valor token en sesión y recuperarlo en <s:param>
etiqueta <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>