2017-02-02 15 views
3

У меня есть сервлет фильтр, который перехватывает запросы и проверяет обычай «зашифрованный» заголовок:Java фильтр - условно изменить тело ответа на основании запроса

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); 
    } 
    } 
} 

Когда заголовок существует, я должен расшифровать тело запроса, а также зашифровать тело ответа. В противном случае следует оставить тело запроса/ответа без изменений.

Как изменить ответ только в случае необходимости?

ответ

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?

+0

Это не отвечает на вопрос, так как я хочу chan ge тело ответа, а не заголовок. – yuz

+0

@yuz Я обновил свой ответ. –

+1

Спасибо, что это работает. – yuz