如何使用Servlet过滤器

时间:2017-01-11 22:18:19

标签: java servlets 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() {
}

}

的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>

1 个答案:

答案 0 :(得分:1)

虽然JAX-RS堆栈是servlet之上的一层,但您最好使用这些标准。有几种方法可以做到这一点。如果谷歌有类似“Jersey JAX-RS logging”的内容,你可以找到泽西特定的登录方式 - 即like this link。否则,如果你想坚持使用JEE标准,那么输入需要一个ContainerRequestFilter,输出需要一个WriterInterceptor。但是免责声明 - 我不知道这是如何与Spring交互的,因为那不是JEE。

我从this stackoverflow answer也学到了很多信息,但这又是标准方式。