在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官网是怎么解释的。
【官方解释】
getSession
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】:
我周围很多同事是这样写的;
代码如下:
Java代码
HttpSession session = request.getSession(); // a new session created if no session exists, 哈哈!完蛋啦!如果session不存在的话你又创建了一个!
String user_name = session.getAttribute("user_name");
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存在的情况,正常的判断应该是这样:
代码如下:
Java代码
HttpSession session = request.getSession(false);
if (session != null) {
String user_name = session.getAttribute("user_name");
}
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)方法,看看高手写的源码吧:哈哈。。
代码如下:
Java代码
/**
* 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);
}
/**
* 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(true)`、`request.getSession(false)`以及`request.getSession(null)`的区别,并提供最佳实践建议。 首先,让我们了解`getSession()`方法的基本行为。根据Servlet官方文档,`...
Request.getSession() 方法详解 Request.getSession() 方法是 HttpServletRequest 对象中的一个方法,用于获取当前 HTTP 请求关联的 HttpSession 对象。如果当前会话不存在,可以通过 create 参数控制是否创建一个...
`request.getSession()`和`request.getSession(false)`是其中两个重要的方法,它们与会话管理密切相关,也是程序员容易忽视的问题所在。 `request.getSession()`方法默认会创建一个新的会话,如果当前请求中还没有...
HttpSession session = request.getSession(); // session.setAttribute("username",username); session.setAttribute("user",user); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response....
request.getSession()方法用于获取当前会话,request.getSession(false)和request.getSession(true)是它的变体: * request.getSession():获取当前会话,如果不存在则创建一个新的会话 * request.getSession(false...
另外,还可以直接调用 `request.getSession()` 方法,这等同于调用 `request.getSession(true)`。 ##### 使用 在 `javax.servlet.http.HttpSession` 接口中定义了一系列方法,用于操作会话数据: - `void ...
request.getSession() reqeust.getSession(false)和 request.getSession(true) 在 Servlet 中,request.getSession() 方法用于获取当前会话对象。如果没有当前会话对象,request.getSession() 方法将创建一个新的...
js:(jsp页面引入md5.js文件) var mobile=$("input[name='mobile']").val(); var hash1=hex_md5(mobile); $("input[name='hidmobile']").val... request.getSession().setAttribute("actList", actList); } }
十、 request.getSession()、reqeust.getSession(false)和 request.getSession(true) request.getSession() 方法用于获取当前请求的 HttpSession 对象: * request.getSession():如果当前请求中没有 HttpSession ...
List<Article> alist1 = (List)request.getSession().getAttribute("alist1"); Iterator<Article> in1 = alist1.iterator(); List<Article> alist2 = (List)request.getSession().getAttribute("alist2"); ...
`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上下文的访问,...
String str = (String) request.getSession().getAttribute("isLogin"); // 如果登录状态不为空则返回 true,返回 true 则会执行相应 controller 的方法 if (str != null) { return true; } // 如果登录状态为...
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页面的局部访问;...
关于会话管理,`request`对象有一个`getSession()`方法,用于创建或获取与当前请求关联的`HttpSession`。这使得可以在多个页面之间共享数据: ```jsp HttpSession session = request.getSession(); session....
request.getSession().setAttribute(sessionId + "_token", UUID.randomUUID().toString()); return invocation.invoke(); } } ``` 在Action配置中添加这个拦截器: ```xml ...
2. 对于 Servlet:若 Servlet 是客户端访问的第一个 WEB 应用的资源,则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HTTP 会话对象。 六、获取 HTTP 会话对象 在 Servlet 中,可以使用...
10. request.getSession()、request.getSession(false)和request.getSession(true) `getSession()`默认创建新的Session,如果已存在则返回;`getSession(false)`不创建新Session,若不存在则返回null;`getSession...