这里主要说一下在非Controller层中如何获取Response对象的方法,之前在项目开发过程中,第三方类库需要用到Response对象,于是度娘寻找如何获取该对象,有以下几种方式都不行,没有去查源码,应该是reponse对象没有再被暴露出来,顺道贴一下网上的方法。
1. 通过spring提供的RequestContextHolder在非contrller层获取request和response对象
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
HttpServletResponse response = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse();
ServletContext context = ContextLoader.getCurrentWebApplicationContext().getServletContext();
该方法不一定有效,根据Spring版本自行寻找问题,现在要说的是另外一种通用的方法。
2.通过拦截器加载线程的方式
这个文件用于加载线程,同时创建、获取、设置、移除HttpServletRequest和HttpServletResponse对象。
/**
* 根据拦截器进行加载当前线程的HttpResponse 和 HttpRequest 对象
* 在非Controller层获取Http对象信息
*/
public class RequestResponseContext {
private static ThreadLocal REQUEST_CHREADLOCAL = new ThreadLocal();
private static ThreadLocal REPONSE_THREADLOCAL = new ThreadLocal();
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;
}
}
如有其他方法,望广大网友告知。