来源:对request.getSession(false)的理解
在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE API,看一下官网是怎么解释的。
【官方解释】
public HttpSession getSession(boolean create)
Returns the current HttpSession associated with this request or, if if there is no current session and create is true, returns a new session. If create is false and the request has no valid HttpSession, this method returns null.
To make sure the session is properly maintained, you must call this method before the response is committed. If the container is using cookies to maintain session integrity and is asked to create a new session when the response is committed, an IllegalStateException is thrown.
Parameters: true - to create a new session for this request if necessary; false to return null if there's no current session
Returns: the HttpSession associated with this request or null if create is false and the request has no valid session
译:
getSession(boolean create)意思是返回当前reqeust中的HttpSession ,如果当前reqeust中的HttpSession 为null,当create为true,就创建一个新的Session,否则返回null;
简而言之:
HttpServletRequest.getSession(ture) 等同于 HttpServletRequest.getSession()
HttpServletRequest.getSession(false) 等同于 如果当前Session没有就为null;
【问题和bug】:
我周围很多同事是这样写的;
HttpSession session = request.getSession(); // a new session created if no session exists, 哈哈!完蛋啦!如果session不存在的话你又创建了一个!
String user_name = session.getAttribute("user_name");
需要注意的地方是request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则尽量使用request.getSession(false)。在使用request.getSession()函数,通常在action中检查是否有某个变量/标记存放在session中。这个场景中可能出现没有session存在的情况,正常的判断应该是这样:
HttpSession session = request.getSession(false);
if (session != null) {
String user_name = session.getAttribute("user_name");
}
【投机取巧】:
如果项目中用到了Spring(其实只要是Java的稍大的项目,Spring是一个很好的选择),对session的操作就方便多了。如果需要在Session中取值,可以用WebUtils工具(org.springframework.web.util.WebUtils)的getSessionAttribute(HttpServletRequest request, String name)方法,看看高手写的源码吧:哈哈。。
代码如下:
/**
* Check the given request for a session attribute of the given name.
* Returns null if there is no session or if the session has no such attribute.
* Does not create a new session if none has existed before!
* @param request current HTTP request
* @param name the name of the session attribute
* @return the value of the session attribute, or <code>null</code> if not found
*/
public static Object getSessionAttribute(HttpServletRequest request, String name) {
Assert.notNull(request, "Request must not be null");
HttpSession session = request.getSession(false);
return (session != null ? session.getAttribute(name) : null);
}
注:Assert是Spring工具包中的一个工具,用来判断一些验证操作,本例中用来判断reqeust是否为空,若为空就抛异常。
分享到:
相关推荐
总结起来,理解`request.getSession()`的不同参数形式对于优化会话管理至关重要。正确使用这些方法可以避免不必要的会话创建,提高应用程序性能,并降低潜在的错误风险。在处理会话时,始终考虑是否真的需要创建新的...
总之,理解`request.getSession()`和`request.getSession(false)`的区别至关重要,因为它关系到会话的生命周期管理和应用程序的性能。正确使用这些方法,可以避免不必要的资源浪费,并提高程序的健壮性。在编写代码...
HttpSession session = request.getSession(false); String username = (String) session.getAttribute("username"); if (username != null) { // 用户已登录 } ``` 通过上述步骤,可以有效地利用 ...
`request.getSession(false)`如果不存在会话,则返回null;`request.getSession(true)`确保创建新的会话。 11. **Page和PageContext的区别**: Page代表当前JSP页面的实例,PageContext提供了对所有JSP隐式对象的...
`request.getSession(false)`如果无现有会话则返回null;`request.getSession(true)`强制创建新会话。 11. **Page和PageContext的区别**:在JSP中,Page代表当前页面对象,而PageContext提供了对JSP上下文的访问,...
request.getSession(false)不创建新Session,若不存在则返回null;request.getSession(true)无论是否存在都会创建新Session。 十一、Page和PageContext的区别 Page代表当前JSP页面的Java对象,PageContext则提供了...
`request.getSession(false)`若无会话则返回null;`request.getSession(true)`强制创建新会话。 十一、Page和PageContext的区别 Page代表当前JSP页面,是PageContext的一个简写引用,提供对JSP页面的局部访问;...
在 Servlet 中,可以使用 request.getSession(boolean create) 方法获取 HTTP 会话对象,其中 create 为 false,若没有和当前 JSP 页面关联的 HTTP 会话对象,则返回 null。 七、HTTP 会话的生命周期 HTTP 会话的...
- `request.getSession(false)`:如果不存在session,返回null,否则返回当前session。 - `request.getSession(true)`:强制创建一个新的session,即使已经有一个活跃的session。 11. Page和PageContext的区别: ...
10. request.getSession()、request.getSession(false)和request.getSession(true) `getSession()`默认创建新的Session,如果已存在则返回;`getSession(false)`不创建新Session,若不存在则返回null;`getSession...
String sessionCode = (String) request.getSession().getAttribute("captcha"); if (StringUtils.isNotBlank(sessionCode) && sessionCode.equalsIgnoreCase(userInput)) { // 验证通过,清除session中的验证码 ...
这意味着如果你在第一次访问时直接使用`getSession(false)`,可能会因尝试访问`null`对象而抛出`NullPointerException`。 - `getSession(true)`:这个方法等同于`getSession()`,如果存在相关`session`,则返回该...
`request.getSession(false)`如果无会话则返回null,避免新建;`request.getSession(true)`无论当前是否有会话,总会创建新的会话。 11. **Page和PageContext的区别** `Page`是JSP的内置对象,代表当前JSP页面本身...
- `request.getSession(false)`:如果当前请求的会话不存在,该方法返回null,不会创建新的Session。 - `request.getSession(true)`和`request.getSession()`:这两个方法类似,如果会话不存在,它们都会创建一个...
9. **Servlet获取HttpSession对象**:`request.getSession(true)`会在不存在会话时创建新的,`request.getSession(false)`则不会创建,`request.getSession()`如果不存在则创建新的会话,存在则返回当前会话。...
if (request.getSession().getAttribute("userId") == null) { response.sendRedirect("/login"); // 未登录,重定向到登录页 return false; // 阻止请求继续处理 } return true; // 用户已登录,允许请求继续 ...
Object user = request.getSession(false).getAttribute("userId"); if(user != null){ isLoggedIn = true; } } %> ``` 这段代码首先尝试获取当前的Session,如果Session存在,那么检查其中是否有存储的用户ID...
10. request.getSession(), request.getSession(false), request.getSession(true):这三个方法用于获取或创建HttpSession。getSession()默认创建新session,getSession(false)如果存在则返回,不存在则返回null,...
`request.getSession(true)`和`request.getSession(false)`之间的区别在于处理会话不存在的情况。`getSession(true)`会检查当前请求是否存在会话,如果存在就返回,如果不存在则会创建一个新的会话。而`getSession...