2017-01-11 3 views
1

Я реализую Servlet Filter вокруг служб Rest и SOAP, чтобы иметь возможность фиксировать запрос и ответ. Фильтр вызывается до того, как вызов переходит на службу отдыха, но я не могу получить элементы запроса из полезной нагрузки. Таким образом, фильтр инициализируется тогда, когда вызов переходит к doFilter, а затем к сервису отдыха, но по переменным запроса и ответа я не вижу ничего, связанного с запросом и ответом на остальные. Надеюсь, что вопрос ясен.Как получить полезную нагрузку запроса/ответа с помощью сервлет-фильтра

Класс фильтра

public class ESignLoggingInterceptor implements Filter { 

private static final Logger logger = Logger.getLogger(ESignLoggingInterceptor.class.getSimpleName()); 

@Override 
public void init(FilterConfig config) throws ServletException { 
    System.out.println("Logging filter initiated"); 

} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    String path = null; 
    if(request != null && request instanceof HttpServletRequest) { 
     path = ((HttpServletRequest) request).getRequestURL().toString(); 
    } 
    chain.doFilter(request, response); 
    System.out.println("Request URL:" + " " + path); 
} 

@Override 
public void destroy() { 
} 

}

web.xml

<servlet> 
    <servlet-name>Jersey Spring</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.mercuryinsurance.esignature.client.rest.service</param-value> 
    </init-param> 
    <init-param>   
     <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>   
     <param-value>/WEB-INF/jsps/rest</param-value>  
    </init-param>  
    <init-param> 
     <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>   
     <param-value>/(resources|(WEB-INF/jsp))/.*</param-value>  
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey Spring</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

<filter> 
    <filter-name>LoggingFilter</filter-name> 
    <filter-class>com.mercuryinsurance.esignature.common.logging.ESignLoggingInterceptor</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>LoggingFilter</filter-name> 
    <url-pattern>/rest/*</url-pattern> 
</filter-mapping> 
+0

Вам необходимо обернуть запрос/ответ сервлета для захвата полезных нагрузок. – ThomasRS

ответ

1

В то время как стек JAX-RS представляет собой слой поверх сервлетов, вы лучше использовать стандарты. Есть несколько способов сделать это. Если вы Google для чего-то типа «Джерси JAX-RS регистрации», вы можете найти Джерси конкретные способы регистрации - то есть like this link. В противном случае, если вы хотите придерживаться стандартов JEE, вам понадобится ContainerRequestFilter для входов и WriterInterceptor для выходов. Но отказ от ответственности - я понятия не имею, как это связано с весной, поскольку это не JEE.

Я узнал очень много информации от this stackoverflow answer, но, опять же, это стандартный способ.

+0

Проблема с JAX-RS заключается в том, что она не соответствует требованиям SOAP. – Mike

+0

Итак, вам нужно регистрировать JAX-WS. Я нашел http://java.globinch.com/enterprise-java/web-services/jax-ws/logging-tracing-web-service-xml-request-response-jax-ws/, но не тестировал его. – stdunbar

+0

На самом деле, у меня есть работа обоих типов, и мне нужно записывать оба. Поэтому изначально я думал, что Servlet Filter будет лучшим подходом для этого. – Mike