在Struts2拦截器中更改请求参数值

时间:2015-05-06 12:06:30

标签: java struts2 request liferay-6 interceptor

有人知道是否可以在Struts2拦截器中更改/删除请求参数值?

请求参数MapUnmodifiableMap的一个实例,因此它看起来不像拦截器中的操作。

更新

我正在使用Liferay,因此uParamsMap将是UnmodifiableMap

public String intercept(ActionInvocation invocation) throws Exception {
    final ActionContext context = invocation.getInvocationContext();
    PortletRequest request = (PortletRequest) context.get(REQUEST);
    Map<String, String[]> uParamsMap = request.getParameterMap();
    return invocation.invoke();
}

2 个答案:

答案 0 :(得分:4)

可能你可以试试这个。

public String intercept(ActionInvocation invocation) throws Exception {
    final ActionContext context = invocation.getInvocationContext();
    Map<String,Object> parameters = (Map<String,Object>)context.get(ActionContext.PARAMETERS);

    Map<String, Object> parametersCopy = new HashMap<String, Object>();
    parametersCopy.putAll(parameters);
    parametersCopy.put("myParam", "changedValue");

    context.put(ActionContext.PARAMETERS, parametersCopy);

    return invocation.invoke();
}

答案 1 :(得分:0)

我的代码中遇到了类似的问题,但上面的解决方案对我不起作用。

如果要在拦截器到达动作类之前对其中的任何参数进行更改,请使用以下代码:

@Override
public String intercept(ActionInvocation ai) throws Exception {

    ValueStack stack=ai.getStack(); 
    Iterator it =  stack.getRoot().iterator();
    while( it.hasNext() )
    {
        Object objecto = it.next();
        //LoginUsuario is my action class
        if( objecto instanceof LoginUsuario )
        {
            LoginUsuario usuario = (LoginUsuario)objecto;
            usuario.setUsername( usuario.getUsername().toUpperCase() );
            usuario.setPassword( usuario.getPassword().toUpperCase() );
        }
    }
    return ai.invoke();
}