- 拦截器的配置说明
<mvc:interceptors>
<bean class="interceptor.HttpServletResponseInterceptor" />
</mvc:interceptors>
- 拦截器的实现
public class HttpServletResponseInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
RequestResponseContext.setResponse(response);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
RequestResponseContext.removeResponse();
}
}
- 这里保存的Httpresponse对象必须是多线程的,使用threadlocal解决这个问题,其实我们的tomact容器中也是这么处理的,这里不仅可以使用拦截器,其实原生的过滤器也是可以这么处理的。我们在使用的时候就可以直接的使用啦!
public class RequestResponseContext {
private static ThreadLocal<HttpServletRequest> REQUEST_CHREADLOCAL = new ThreadLocal<HttpServletRequest>();
private static ThreadLocal<HttpServletResponse> REPONSE_THREADLOCAL = new ThreadLocal<HttpServletResponse>();
public static void setRequest(HttpServletRequest request) {
REQUEST_CHREADLOCAL.set(request);
}
public static HttpServletRequest getRequest() {
return REQUEST_CHREADLOCAL.get();
}
public static void removeRequest() {
REQUEST_CHREADLOCAL.remove();
}
public static void setResponse(HttpServletResponse response) {
REPONSE_THREADLOCAL.set(response);
}
public static HttpServletResponse getResponse() {
return REPONSE_THREADLOCAL.get();
}
public static void removeResponse() {
REPONSE_THREADLOCAL.remove();
}
}