SpringMVC中获取Session的五种方式

SpringMVC中获取Session的五种方式

上来就说第四种,因为个人觉得第四种比较好

第四种:使用RequestContextHolder类获取request,间接获取到session

通过使用RequestContextHolder这个类我们可以在不传入HttpServletRequest,直接获取到本次请求中的request。

一般使用中我们会对它进行封装,做成一个工具方法进行使用

注意:在使用RequestContextHolder时,需要先配置RequestContextListener监听器,否则会出现:获取HttpSession、HttpServletRequest、HttpServletResponse 为 null 情况。

因为:RequestContextListener实现了 ServletRequestListener(监听HTTP请求事件,Web服务器接收的每次请求都会通知该监听器),其覆盖的requestInitialized(ServletRequestEvent requestEvent)方法会将request最终设置到了RequestContextHolder中。

参见:

在springmvc中使用requestContextListener获取全部的request对象

ContextLoaderListener与RequestContextListener区别

SpringMVC之RequestContextHolder分析

org.springframework.web.context.request.RequestContextListener

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注解使用、区分与总结】

转:Spring MVC 中获取session的几种方法

相关数据

关羽的真名叫什么(关羽真名叫什么绰号叫什么)
office365网页版无法使用

关羽的真名叫什么(关羽真名叫什么绰号叫什么)

⏳ 07-01 💖 805
蓝光和超清的区别有哪些?蓝光和超清哪个伤眼睛?
office365网页版无法使用

蓝光和超清的区别有哪些?蓝光和超清哪个伤眼睛?

⏳ 07-05 💖 318