【问题标题】:Java filter - conditionally change response body based on requestJava过滤器 - 根据请求有条件地更改响应正文
【发布时间】:2017-06-19 07:00:51
【问题描述】:

我有一个 servlet 过滤器,它拦截请求并检查自定义“加密”标头:

public class EncryptionFilter extends GenericFilterBean{

@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) {
    final HttpServletRequest httpRequest = (HttpServletRequest) request;
    if (httpRequest.getHeader("EncryptedCommunication") != null){
        decryptedRequest = /*decrypt request body and forward to next filter*/
        encryptedResponse = /*encrypt request body and forward to next filter*/
        filterChain.doFilter(decryptedRequest, encryptedResponse);
    }
    else { /* communication not encrypted */
        filterChain.doFilter(request, response);
    }
  }
}

当标头存在时,我应该解密请求正文并加密响应正文。 否则,应保持请求/响应正文不变。

如何仅在需要时更改响应?

【问题讨论】:

    标签: java spring spring-security servlet-filters


    【解决方案1】:

    你需要使用一个HttpServletResponseWrapper的例子是:

    filterChain.doFilter(servletRequest,
            new HttpServletResponseWrapper((HttpServletResponse) servletResponse) {
                @Override
                public void setHeader(String name, String value) {
                    if (!HTTPCacheHeader.ETAG.getName().equalsIgnoreCase(name)) {
                        super.setHeader(name, value);
                    }
                }
            });
    

    http://www.programcreek.com/java-api-examples/javax.servlet.http.HttpServletResponseWrapper

    这是如何设置主体的示例:

    public class ReadTwiceHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    
    public ReadTwiceHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        try {
            IOUtils.copy(request.getInputStream(), outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray())));
    }
    
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        return new ServletInputStream() {
    
            @Override
            public int readLine(byte[] b, int off, int len) throws IOException {
                return inputStream.read(b, off, len);
            }
    
            @Override
            public boolean isFinished() {
                return inputStream.available() > 0;
            }
    
            @Override
            public boolean isReady() {
                return true;
            }
    
            @Override
            public void setReadListener(ReadListener arg0) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public int read() throws IOException {
                return inputStream.read();
            }
        };
    }
    
    public void setBody(String body) {
        outputStream = new ByteArrayOutputStream();
        try {
            outputStream.write(body.getBytes());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public String getBody() {
        return new String(outputStream.toByteArray());
    }
    

    How to get the XML from POST request and modify it in Servlet Filter?

    【讨论】:

    • 这没有回答问题,因为我想更改响应正文而不是标题。
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2017-06-25
    相关资源
    最近更新 更多