SpringMVC中获取Session的五种方式
2022-01-13 本文已影响0人
想象之中丶意料之外
- 上来就说第四种,因为个人觉得第四种比较好
第四种:使用RequestContextHolder类获取request,间接获取到session
- 通过使用RequestContextHolder这个类我们可以在不传入HttpServletRequest,直接获取到本次请求中的request。
- 一般使用中我们会对它进行封装,做成一个工具方法进行使用
- 注意:在使用RequestContextHolder时,需要先配置RequestContextListener监听器,否则会出现:获取HttpSession、HttpServletRequest、HttpServletResponse 为 null 情况。
- 因为:RequestContextListener实现了 ServletRequestListener(监听HTTP请求事件,Web服务器接收的每次请求都会通知该监听器),其覆盖的requestInitialized(ServletRequestEvent requestEvent)方法会将request最终设置到了RequestContextHolder中。
- 参见:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
public class ToolUtil {
/**
* 纠正一下:ServletRequestAttributes 这个不能作为常量获取,因为每次request请求。
* 都会建立新的RequestAttributes,如果使用static final 修饰,会导致无法获取到新的 RequestAttributes。
* 从而导致无法获取到session
*
* private static final ServletRequestAttributes SERVLET_REQUEST_ATTRS;
* static {
* SERVLET_REQUEST_ATTRS = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
* }
*/
private static final String SESSION_USER_KEY = "userInfo";
public static final String DEFAULT_INDEX_VIEW = "view/back/index";
public static final String SUPER_USER_ID = "99999999999999990000000000000000";
/**
* 获取最新的 ServletRequestAttributes
* @return
*/
private static ServletRequestAttributes getServletRequestAttrs() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
System.out.println("ToolUtil初始化了->" + requestAttributes);
return requestAttributes;
}
/**
* HttpServletRequest 获取
*
* @return HttpServletRequest
*/
public static HttpServletRequest getRequest() {
return getServletRequestAttrs().getRequest();
}
/**
* @return HttpSession
*/
public static HttpSession getSession() {
return getServletRequestAttrs().getRequest().getSession();
}
public static HttpServletResponse getResponse() {
return getServletRequestAttrs().getResponse();
}
/**
* 从Session中获取用户信息
*
* @return user
*/
public static User getSessionUser() {
return (User) getSession().getAttribute(SESSION_USER_KEY);
}
public static void setSessionUser(User user) {
getSession().setAttribute(SESSION_USER_KEY, user);
}
public static String getBaseUrl() {
HttpServletRequest request = getRequest();
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
}
public static String uuid() {
return StrUtil.removeAll(String.valueOf(UUID.randomUUID()), "-").toUpperCase();
}
}
第一种:将HttpSession 作为Controller方法的参数
@RequestMapping("get")
public void get(HttpSession session) {
}
第二种:将HttpServletRequest作为Controller方法的参数
- 先是获取到request
- 然后通过request间接的获取到session
@RequestMapping("get")
public void get(HttpServletRequest request) {
HttpSession session = request.getSession();
}
第三种:通过@Autowired 将 HttpServletRequest注入进来
注: 测试好像不行,可能我不会用。
- 然后获取request
- 再获取 session
// 这个request会飘红,提示:找不到HttpServletRequest 这个bean
@Autowired
private HttpServletRequest request;
第五种: 使用@SessionAttributes 和 @SessionAttribute 注解
- @SessionAttributes注解:用于设置session属性值【见:Spring MVC @SessionAttributes注解 】
- @SessionAttribute注解:用于获取session属性值,并且作用在方法形参上,类似@RequestBody【见:@SessionAttribute、@SessionAttributes注解使用、区分与总结】