如何在Map之前获取原始参数

ohfgkhjo  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(304)

我发现了Struts1框架的新问题。我需要从页面中过滤一些输入值,所以我编写了自定义过滤器来实现这一点。
它非常适用于没有Map到任何形式的单个参数。但是当它被Map到一些struts表单字段时,它不会得到参数。
有人知道怎么处理吗?
这是我的过滤器代码

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 ,然后在一些临时文件中定义它们。我认为最好的方法是修改所有的请求参数,然后让它抛出struts1.3.8库。

wwwo4jvm

wwwo4jvm1#

经过两天的研究和试验,我找到了一些解决办法。我编写了定制的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会将请求 Package 到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配置中

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

仅此而已:)

lpwwtiir

lpwwtiir2#

我对这个非常生疏,但是actionform.reset方法(actionmapping,httpservletrequest)可能会给你想要的东西。
几年前,我不得不使用它来计算一些东西,然后在属性中Map,此时您应该可以访问所有请求参数。

相关问题