2016-07-16 5 views
1

要求のContent-Typeヘッダーを変更し、それをバネレストコントローラに到達する前に "application/json"に変更しようとしています。値を変更するためにサーブレットリクエストラッパーを作成しましたが、リクエストがコントローラに到達すると、まだ「text/plain」です。ロギングは、ヘッダ値が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() { 

} 


} 

答えて

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); 
} 
関連する問題