繁体   English   中英

如何使用 Servlet 过滤器获取请求/响应负载

[英]How to get request/response payload using Servlet Filter

我正在围绕 Rest 和 SOAP 服务实现Servlet Filter ,以便能够捕获请求和响应。 在调用进入休息服务之前调用过滤器,但我无法从有效负载中获取请求的元素。 所以过滤器初始化然后调用转到 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() {
}

}

网页.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>

虽然 JAX-RS 堆栈是位于 servlet 之上的一层,但您最好使用这些标准。 有几种方法可以做到这一点。 如果您在 Google 上搜索诸如“Jersey JAX-RS 日志记录”之类的内容,您可以找到 Jersey 特定的日志记录方式—— 例如这个链接 否则,如果您想坚持 JEE 标准,您将需要一个用于输入的 ContainerRequestFilter 和一个用于输出的 WriterInterceptor。 但是免责声明 - 我不知道它是如何与 Spring 交互的,因为那不是 JEE。

我也从这个 stackoverflow 答案中学到了大量信息,但同样,这是标准方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM