我使用过JERSEY框架,它提供了实现过滤器的功能,以便所有响应都能通过它。
我是Spring / Spring新手。我不了解如何实现我提到的上述功能。
基本上我希望我的每个响应应该通过我的过滤器。
怎么做?
示例示例将有所帮助。
如果我按照 @Errabi Ayoub 的建议实施如下:
@Component
public class MyClassFilter implements Filter {
@Override
public void doFilter( HttpServletRequest req, HttpServletResponse res,
FilterChain chain) throws IOException, ServletException {
// you can modify your response here before the call of chain method
//example
apiLogger.logResponse();
res.setHeader("key", "value");
chain.doFilter(req, res);
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
我有一个方法apiLogger.logResponse();
然后我的方法将被调用两次,根据我的逻辑,首先它将在请求时调用,然后再响应。我不想要那个。我只想在响应时记录。
感谢。
答案 0 :(得分:3)
您可以通过实施过滤器接口
来实现@Component
public class MyClassFilter implements Filter {
@Override
public void doFilter( HttpServletRequest req, HttpServletResponse res,
FilterChain chain) throws IOException, ServletException {
// you can modify your response here before the call of chain method
//example
res.setHeader("key", "value");
chain.doFilter(req, res);
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
答案 1 :(得分:0)
简短回答是在doFilter方法之后过滤响应。
@Bean
public Filter myCustomFilter() {
return (request, response, chain) -> {
logger.info("do Request Filtering ... ");
chain.doFilter(request, response); // Do Response Filter after this
logger.info("do Response Filtering ... ");
};
}
说明
Servlet容器中的Servlet过滤器在链中被调用,每个过滤器通过FilterChain doFilter方法调用链中的下一个过滤器。过滤器链中的最后一个过滤器将请求委托给实际的Servlet,然后由该Servlet处理请求并生成响应。然后,响应以相反的顺序通过“过滤器链”中的每个过滤器。因此,最后一个过滤器在处理响应时成为第一个过滤器,并通过所有过滤器返回给客户端。