解法一:利用RequestContextListener
首先,在web.xml配置:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
然后,就可以在service或者dao中获取HttpServletRequest 的代码如下:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
为了方便,可以如上代码提取到一个工具方法中,避免重复。例如:本来需求是要获取session中存的国际化信息Locale,就可以这样处理:
/**
* 获取当前Session中Locale信息
* @author weijuer
* @return
*/
public static Locale getLocale() {
// 获取HttpServletRequest
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return (Locale) request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
}
解法二:利用BaseController注入
我用Spring MVC , 在Controller方法里每次都要写一个HttpServletRequest request参数,Spring才会注入request,然后我就产生了一个神奇的想法,写一个BaseController把request注入,然后其它Controller继承后就不需要再写request就可以直接使用父类的request:
abstract class BaseController {
private HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
@Resource
public void setRequest(HttpServletRequest request) {
this.request = request;
}
}
事实上这么也成功注入了,子Controller可以使用request。