【问题标题】:Servlet Filter modify header value with servlet request wrapper not workingServlet 过滤器修改标头值,而 Servlet 请求包装器不起作用
【发布时间】:2016-11-19 20:26:46
【问题描述】:

我正在尝试更改请求中的 Content-Type 标头,并在它到达我的 spring rest 控制器之前将其更改为“application/json”。我创建了一个 servlet 请求包装器来更改值,但是当请求到达控制器时,它仍然是“文本/纯文本”。日志显示,在点击 doFilter() 之前,标头值已更改;

这是我的类扩展 HttpServletRequestWrapper

class HttpServletRequestWritableWrapper extends HttpServletRequestWrapper {
private final Logger logger = org.slf4j.LoggerFactory.getLogger(HttpServletRequestWritableWrapper.class);
private final ByteArrayInputStream decryptedBody;

HttpServletRequestWritableWrapper(HttpServletRequest request, byte[] decryptedData) {
    super(request);
    decryptedBody = new ByteArrayInputStream(decryptedData);
}



@Override
public String getHeader(String name) {
    String headerValue = super.getHeader(name);
    if("Accept".equalsIgnoreCase(name))
    {
        logger.debug("Accept header changing :");
        return headerValue.replaceAll(
                MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_JSON_VALUE
        );
    }
    else if ("Content-Type".equalsIgnoreCase(name))
    {
        logger.debug("Content type change: ");
        return headerValue.replaceAll(MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_JSON_VALUE);
    }
    return headerValue;
}

@Override
public Enumeration<String> getHeaderNames() {
    return super.getHeaderNames();
}

@Override
public String getContentType() {
    String contentTypeValue = super.getContentType();
    if (MediaType.TEXT_PLAIN_VALUE.equalsIgnoreCase(contentTypeValue)) {
        logger.debug("Changing on getContentType():");
        return MediaType.APPLICATION_JSON_VALUE;
    }
    return contentTypeValue;
}


@Override
public BufferedReader getReader() throws UnsupportedEncodingException {
    return new BufferedReader(new InputStreamReader(decryptedBody, UTF_8));
}

@Override
public ServletInputStream getInputStream() throws IOException {
    return new ServletInputStream() {
        @Override
        public int read() {
            return decryptedBody.read();
        }
    };
}

这是我的过滤器:

@WebFilter(displayName = "EncryptionFilter", urlPatterns = "/*")
public class EncryptionFilter implements Filter {
private final Logger logger = org.slf4j.LoggerFactory.getLogger(EncryptionFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    byte[] data = "{\"currentClientVersion\":{\"majorElement\":\"1\",\"minorElement\":\"2\"}}".getBytes();

    logger.debug("data string " + data.toString());

    logger.debug("Content-type before: " + servletRequest.getContentType());

    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletRequestWritableWrapper requestWrapper = new HttpServletRequestWritableWrapper(request, data);
    //logger.debug("Accept Header: " + requestWrapper.getHeader("Accept"));
    //logger.debug("Content-Type: " + requestWrapper.getHeader("Content-Type"));
    //logger.debug("Contenttype" + requestWrapper.getContentType());

    filterChain.doFilter(requestWrapper, servletResponse);


}

@Override
public void destroy() {

}


}

【问题讨论】:

    标签: spring servlet-filters


    【解决方案1】:

    似乎在我的过滤器之后在其他地方调用了 getHeaders 方法,并且没有返回带有我更新值的标题。

    我在我的 HttpServletRequestWrapper 中添加了这个覆盖,它现在可以工作了:

    @Override
    public Enumeration<String> getHeaders(String name) {
        List<String> headerVals = Collections.list(super.getHeaders(name));
        int index = 0;
        for (String value : headerVals) {
            if ("Content-Type".equalsIgnoreCase(name)) {
                logger.debug("Content type change: ");
                headerVals.set(index, MediaType.APPLICATION_JSON_VALUE);
            }
    
            index++;
        }
    
        return Collections.enumeration(headerVals);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2014-10-26
      • 1970-01-01
      • 2013-05-05
      • 2011-02-18
      • 2018-10-02
      • 2017-06-25
      • 2015-09-12
      • 2013-06-29
      相关资源
      最近更新 更多