这里主要说一下在非Controller层中如何获取Response对象的方法,以前在项目开发过程当中,第三方类库须要用到Response对象,因而度娘寻找如何获取该对象,有如下几种方式都不行,没有去查源码,应该是reponse对象没有再被暴露出来,顺道贴一下网上的方法。java
1. 经过spring提供的RequestContextHolder在非contrller层获取request和response对象spring
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); HttpServletResponse response = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse(); ServletContext context = ContextLoader.getCurrentWebApplicationContext().getServletContext();
该方法不必定有效,根据Spring版本自行寻找问题,如今要说的是另一种通用的方法。ide
2.经过拦截器加载线程的方式线程
这个文件用于加载线程,同时建立、获取、设置、移除HttpServletRequest和HttpServletResponse对象。code
/** * 根据拦截器进行加载当前线程的HttpResponse 和 HttpRequest 对象 * 在非Controller层获取Http对象信息 */ public class RequestResponseContext { private static ThreadLocal<HttpServletRequest> REQUEST_CHREADLOCAL = new ThreadLocal<HttpServletRequest>(); private static ThreadLocal<HttpServletResponse> REPONSE_THREADLOCAL = new ThreadLocal<HttpServletResponse>(); public static void setRquest(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(); } }
拦截器,继承HandlerInterceptorAdapter,在建立以前和结束后,要将对象存入和移除。对象
/** * Response和Request拦截器,主要用于获取Response * 经过拦截器保存当前的请求的对象信息进行处理 */ public class HttpServletResponseInterceptor extends HandlerInterceptorAdapter{ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { RequestResponseContext.removeRequest(); RequestResponseContext.removeResponse(); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { RequestResponseContext.setRquest(request); RequestResponseContext.setResponse(response); return true; } }
若有其余方法,望广大网友告知。继承