簡體   English   中英

Java過濾器 - 根據請求有條件地更改響應主體

[英]Java filter - conditionally change response body based on request

我有一個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);
    }
  }
}

當標頭存在時,我應該解密請求主體並加密響應主體。 否則,應保持請求/響應主體不變。

如何在需要時更改響應?

您需要使用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());
}

請參閱如何從POST請求獲取XML並在Servlet過濾器中對其進行修改?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM