2016-07-16 4 views
1

Ich versuche, den Content-Type-Header in einer Anfrage zu ändern und ändern Sie es in "Anwendung/Json", bevor es meine Feder Ruhe-Controller erreicht. Ich habe einen Servlet Request Wrapper erstellt, um die Werte zu ändern, aber wenn die Anfrage den Controller erreicht, ist es immer noch "text/plain". Die Protokollierung zeigt, dass der Header-Wert geändert wurde, bevor doFilter() angeklickt wurde.Servlet Filter ändern Header-Wert mit Servlet Request Wrapper funktioniert nicht

Hier ist meine Klasse 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(); 
     } 
    }; 
} 

erstreckt, und hier ist mein Filter:

@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() { 

} 


} 

Antwort

1

Es scheint, dass die getHeaders Methode woanders nach meinem Filter genannt wurde und nicht die Header mit der Rückkehr Meine aktualisierten Werte.

Ich habe diese Überschreibung in meinem HttpServletRequestWrapper und es arbeitet jetzt:

@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); 
} 
Verwandte Themen