1

シンプルな JSON サニタイズ Filter/RequestWrapper があります (コンテンツ タイプは ですapplication/json)。ただし、重要なオーバーライド ( getReader(), getInputStream(), getParameter*()) がラッパー内で呼び出されることはありません。

これは私のフィルターです:

public class MyFilter implements Filter 
{

    public MyFilter()
    {
        //Empty
    }

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

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
            throws IOException, ServletException
    {
        HttpServletRequest httpRequest = (HttpServletRequest)request;
        HttpServletResponse httpResponse = (HttpServletResponse)response;
        MyRequestWrapper wrappedRequest = new MyRequestWrapper(httpRequest);

        chain.doFilter(wrappedRequest, httpResponse);
    }

    @Override
    public void destroy() 
    {
        // TODO Auto-generated method stub

    }
}

ここに私のラッパーがあります:

public class MyRequestWrapper extends HttpServletRequestWrapper
{
    private HttpServletRequest servletRequest;

    public MyRequestWrapper(HttpServletRequest servletRequest) 
    {
        super(servletRequest);
        this.servletRequest = servletRequest;
    }

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

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

        int count = values.length;
        String[] sanitizedValues = new String[count];
        for (int i = 0; i < count; i++)
        {
            sanitizedValues[i] = sanitizeUserInput(values[i]);
        }

        return sanitizedValues;
    }

    @Override
    public String getParameter(String parameter)
    {
        String value = super.getParameter(parameter);
        return sanitizeUserInput(value);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException 
    {
        return this.servletRequest.getInputStream();
    }

    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    private String sanitizeUserInput(String input) 
    {
        // ...
        return input;
    }
}

getParameterMap()、getHeaders() などのオーバーライドも試みました。オーバーライドの一部は呼び出されますが、json がサーブレットにポストされたときは呼び出されません。フィルターチェーンの別のフィルターがポスト本体を飲み込む可能性はありますか? これをデバッグする方法はありますか?

ありがとう

4

0 に答える 0