Java 如何在Spring拦截器中读取httpservletresponse?
我正在处理将api请求和响应记录在数据库中的任务。我需要自动连接SpringBeans来访问数据库,我们不能在过滤器内部自动连接SpringBeans 问题是我们只能在使用HttpServletResponseWrapper的过滤器中多次读取响应 有没有办法在spring拦截器中多次读取响应 这是我使用过滤器的代码。它可以检索所有信息,但不能在ApiActivityManager中自动连接bean以在数据库中插入数据 若我在拦截器中读取一次响应,那个么控制器中的响应为nullJava 如何在Spring拦截器中读取httpservletresponse?,java,spring,spring-mvc,filter,interceptor,Java,Spring,Spring Mvc,Filter,Interceptor,我正在处理将api请求和响应记录在数据库中的任务。我需要自动连接SpringBeans来访问数据库,我们不能在过滤器内部自动连接SpringBeans 问题是我们只能在使用HttpServletResponseWrapper的过滤器中多次读取响应 有没有办法在spring拦截器中多次读取响应 这是我使用过滤器的代码。它可以检索所有信息,但不能在ApiActivityManager中自动连接bean以在数据库中插入数据 若我在拦截器中读取一次响应,那个么控制器中的响应为null public cl
public class ApiActivityInterceptor implements Filter {
ApiActivityManager apiActivityManager = new ApiActivityManager();
@Override public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MyRequestWrapper requestWrapper = new MyRequestWrapper((HttpServletRequest)request);
MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse)response);
InputStream inputStream = requestWrapper.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
String requestText = stringBuilder.toString();
log.info(requestText);
chain.doFilter((ServletRequest)requestWrapper,(ServletResponse)responseWrapper);
String responseText = new String(responseWrapper.getCopy(),responseWrapper.getCharacterEncoding());
log.info(responseText);
//for log details in database
activityLogDetails.setActivityLog(requestText,responseText);
}
@Override public void destroy() {
}
}
感谢过滤器类中的autowire spring Bean 首先在过滤器类中添加@Component注释。 注册过滤器,过滤器名称为bean名称,过滤器类为org.springframework.web.filter.DelegatingFilterProxy 所以我的解决方案是 ApActivityFilter.java 使用Java配置注册过滤器 使用XML配置注册过滤器
您可以为过滤器自动连接bean。你必须使用DelegatingFilterProxy。你能解决这个问题吗?我面临着同样的问题。@n3o,我已经解决了。今天我将发布答案。
@Component("apiActivityFilter")
public class ApiActivityFilter implements Filter {
@Autowired
ApiActivityManager apiActivityManager;
@Override public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MyRequestWrapper requestWrapper = new MyRequestWrapper((HttpServletRequest)request);
MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse)response);
InputStream inputStream = requestWrapper.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
String requestText = stringBuilder.toString();
log.info(requestText);
chain.doFilter((ServletRequest)requestWrapper,(ServletResponse)responseWrapper);
String responseText = new String(responseWrapper.getCopy(),responseWrapper.getCharacterEncoding());
log.info(responseText);
//for log details in database
apiActivityManager.logApiActivity(activityLog);//activityLog Object to be logged
}
@Override public void destroy() {
}
}
FilterRegistration.Dynamic apiActivityFilter = servletContext.addFilter("apiActivityFilter", DelegatingFilterProxy.class);
apiActivityFilter.addMappingForUrlPatterns(null, true, "/api/*");
<filter>
<filter-name>apiActivityFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>apiActivityFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>