学了java接近一年,除了刚开始写了几篇基础知识的博客,之后便寥寥无几。
今天,笔者给大家分享spring如何优雅的获取session的方式之一,诚然spring/mvc有多种方法获取session,但笔者暂时只会一种。
闲话少说,要想获取session那么我们先在web.xml中配置一段XML代码:
<!-- session监听器 -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
这段代码的作用,便是启动session监听器。
在这里,读者可以打开RequestContextListener的源码如下:
public class RequestContextListener implements ServletRequestListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =
RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";
@Override
public void requestInitialized(ServletRequestEvent requestEvent) {
if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException(
"Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
}
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes);
}
以上源码看不懂可以忽略。
在web.xml中设置了监听器后,我们便可以编写简单的实现类。
如下:
注意,获取session是要用RequestContextHolder来获取,具体原因请读者仔细看RequestContextListener源码。
public class UserContext {
public static final String USER_IN_SESSION = "user";
private static HttpSession getSession() { //获取session
return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
.getRequest().getSession();
}
public static void putCurrent(LoginInfo info){
//得到session,并把info放在session中
getSession().setAttribute(USER_IN_SESSION, info);
}
public static LoginInfo getCurrent(){
return (LoginInfo) getSession().getAttribute(USER_IN_SESSION);
}
}