如何在映射之前获取原始参数

时间:2013-06-06 09:44:23

标签: java parameters filter struts

我在Struts 1框架中遇到了新问题。我需要从页面中过滤一些输入值,所以我编写了自定义过滤器来执行此操作。

它适用于未映射到任何表单的单个参数。但是当它被映射到某些struts Form字段时,它不会获取参数。

有谁知道如何处理它?<​​/ p>

以下是我的过滤器的代码

public class XSSFillter implements Filter {


@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new XSSRequest((HttpServletRequest) request), response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {       
}

@Override
public void destroy() {
}
    }

并且

public class XSSRequest extends MultipartRequestWrapper{

public XSSRequest(HttpServletRequest request) {
    super(request);
}

@Override
public String[] getParameterValues(String name) {
    String[] values = super.getParameterValues(name);

    if(values == null){
        return null;
    }

    String[] newValues = new String[values.length];

    for(int index = 0; index < values.length; index++ ){
        newValues[index] = XSSFilterUtil.removeXSSTokens(values[index]);
    }

    return newValues;
}

@Override
public String getParameter(String name) {
    String value = super.getParameter(name); 
    return XSSFilterUtil.removeXSSTokens(value);
}

@Override
public String getHeader(String name) {
    String value = super.getHeader(name);
    return XSSFilterUtil.removeXSSTokens(value);
}
}

当然我已经在web.xml中定义了它

我猜这是最重要的部分之一。

if (isMultipart) {
            parameterValue = multipartParameters.get(name);
        } else {
            parameterValue = request.getParameterValues(name);
        }

因此,在一个案例parameterValue中取自multipartParameters,而在一些临时文件中定义它们。我认为最好的方法是修改所有请求参数,然后让它去抛出Struts 1.3.8库。

2 个答案:

答案 0 :(得分:0)

我对此非常生疏,但方法ActionForm.reset(ActionMapping, HttpServletRequest)可能会给你你想要的东西。

我必须在几年前使用它来计算属性映射之前的内容,你应该可以访问所有请求参数。

答案 1 :(得分:0)

经过两天的研究和实践,我找到了一些解决方案。我写了自定义 MultipartRequestHandler

public class XSSMultipartRequestHandler extends CommonsMultipartRequestHandler {

    @Override
    public Hashtable getAllElements() {
        Hashtable table = super.getAllElements();
        for (Object key : table.keySet()) {
            Object value = table.get(key);
            if (value instanceof String[]) {
                String[] arr = (String[]) value;
                String[] newValue = { XSSFilterUtil.removeXSSTokens(arr[0]) };
                table.put(key, newValue);
            }
        }
        return table;
    }

}

此外,您需要编写自定义RequestProcessor,因为在验证struts将请求包装到 MultipartRequestWrapper

之前
public class XSSRequestProcessor extends TilesRequestProcessor {

    @Override
    protected boolean processValidate(HttpServletRequest request,
            HttpServletResponse response, ActionForm form, ActionMapping mapping)
            throws IOException, ServletException, InvalidCancelException {
        return super.processValidate(new XSSFilteredRequest(request), response, form, mapping);
    }

}

和struts-config

<controller processorClass="com.package.filter.XSSRequestProcessor" multipartClass="com.package.filter.XSSMultipartRequestHandler" contentType="text/html; charset=UTF-8"/>

这就是全部:)