OncePerRequestFilter 同时获取入参和出参
时间: 2024-09-10 22:25:13 浏览: 41
`OncePerRequestFilter` 是Spring框架中提供的一个抽象类,用于确保在一次请求中只执行一次过滤逻辑,无论请求是被直接访问还是由其他过滤器转发而来。这对于那些可能会多次执行的过滤逻辑特别有用,比如日志记录、身份验证等。
如果你想在`OncePerRequestFilter`中同时获取入参(请求)和出参(响应),你可以通过重写`doFilterInternal`方法来实现。在这个方法中,你可以访问`HttpServletRequest`和`HttpServletResponse`对象来获取请求信息和准备响应信息。以下是一个简单的示例:
```java
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class ExampleOncePerRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 获取请求参数等信息,即入参
String requestInfo = "Request URL: " + request.getRequestURL() + ", Method: " + request.getMethod();
// 继续处理过滤器链,以便后续的过滤器或目标资源可以执行
filterChain.doFilter(request, response);
// 请求处理完成后,获取响应信息,即出参
// 注意:此时响应已经发送给客户端,一般不再修改响应内容
String responseInfo = "Response Status: " + response.getStatus();
// 这里可以记录日志或者进行其他操作
// ...
}
}
```
在这个例子中,我们在`doFilterInternal`方法中首先处理请求,获取请求信息,然后调用`filterChain.doFilter(request, response);`继续过滤器链的处理。过滤器链执行完毕后,我们可以获取响应对象`response`的状态码等信息,进行必要的处理。
需要注意的是,通常在过滤器中不应该修改已经发送给客户端的响应。因此,虽然可以获取响应信息,但在实际应用中,应当谨慎考虑是否有必要在过滤器中对响应进行操作。
阅读全文