`
落地窗
  • 浏览: 438223 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

request.getSession() 陷阱 注意 注意

阅读更多
[size=large]【前面的话】
在网上经常看到有人对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】:
我周围很多同事是这样写的;
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是否为空,若为空就抛异常。
上面的代码又可以简洁一下啦,看吧:
HttpSession session = request.getSession(false); 
String user_name = WebUtils.getSessionAttribute(reqeust, "user_name"); 
[/size]
分享到:
评论

相关推荐

    request.getSession().doc

    Request.getSession() 方法详解 Request.getSession() 方法是 HttpServletRequest 对象中的一个方法,用于获取当前 HTTP 请求关联的 HttpSession 对象。如果当前会话不存在,可以通过 create 参数控制是否创建一个...

    java 中 request.getSession(true、false、null)的区别

    本文将深入探讨`request.getSession(true)`、`request.getSession(false)`以及`request.getSession(null)`的区别,并提供最佳实践建议。 首先,让我们了解`getSession()`方法的基本行为。根据Servlet官方文档,`...

    jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)

    `request.getSession()`和`request.getSession(false)`是其中两个重要的方法,它们与会话管理密切相关,也是程序员容易忽视的问题所在。 `request.getSession()`方法默认会创建一个新的会话,如果当前请求中还没有...

    request.setAttribute 语句前总显示红色感叹号解决办法 HTTP Status 500 -

    在Java Web开发中,我们经常遇到各种运行时错误或编译错误,其中一种较为常见的问题是`request.setAttribute`方法调用时出现红色感叹号提示,并且伴随着HTTP 500错误。这种问题通常是由类型不匹配导致的,比如尝试将...

    基于servlet的购物车

    Map, Book&gt; books = (Map, Book&gt;)request.getSession().getServletContext().getAttribute("books"); Book book = books.get(bookid); System.out.println(book); //得到数量 int bookNum = Integer....

    getServletContext()空指针异常的原因

    getServletContext()空指针异常的原因getServletContext()空指针异常的原因getServletContext()空指针异常的原因getServletContext()空指针异常的原因getServletContext()空指针异常的原因

    request.getParameter()取值为null的解决方法

    4. 注意id和name属性的命名约定。虽然HTML标准允许id和name属性值包含字母、数字、下划线、连字符和点,但出于可读性和可维护性的考虑,应使用有意义的名称,且避免在JavaScript和服务器端代码中产生歧义。 5. 了解...

    数据库测试test.sql

    HttpSession session = request.getSession(); // session.setAttribute("username",username); session.setAttribute("user",user); //response.sendRedirect("/myservlet2/admin/success.jsp"); //response....

    javaweb 做图片水印,水印图片到目录图片上去

    String planeImage = request.getSession().getServletContext().getRealPath("/image").replace("\\", "/")+"/"+"symark.png"; //获取目标图片的路径String targetPic = request.getSession().getServletContext()....

    jsp获取action传来的session和session清空以及判断.docx

    使用request.getSession()方法可以获取当前请求的session对象,然后可以通过getAttribute()方法获取session中的值,例如:&lt;%=request.getSession().getAttribute("sessionid"); %&gt;。这种方法也可以获取session的值,...

    于笑扬java综合知识点总结-必背(吐血推荐).doc

    request.getSession()方法用于获取当前会话,request.getSession(false)和request.getSession(true)是它的变体: * request.getSession():获取当前会话,如果不存在则创建一个新的会话 * request.getSession(false...

    java中相对路径,绝对路径问题总结.doc

    - 文件的绝对路径:`request.getSession().getServletContext().getRealPath(request.getRequestURI())` - Web应用的绝对路径:`servletConfig.getServletContext().getRealPath("/")` 总的来说,正确理解和使用...

    通用分页js

    String totalCount = (String) request.getSession().getAttribute("totalCount") == null ? "0" : (String) request.getSession().getAttribute("totalCount"); String pageNum = (String) request.getSession()....

    sevlet生命周期,request web.xml 及ServletContext总结

    使用`request.getSession()`创建或获取HttpSession对象,以进行会话管理。 - **HTTP方法**: `request.getMethod()`返回请求的HTTP方法(GET、POST等)。 - **其他请求信息**: 包括但不限于:`request....

    用户管理系统(ums)

    HttpSession session= request.getSession(); // 设置session的值 session.setAttribute("userList", list); //跳转到显示的页面,格式(得到当前页面的+要跳转的页面) response.sendRedirect(request....

    weChatpay完整版java

    注意要点: 1,Topay里面的参数要填好:appid,appsecret,mch_id,partnerkey,spbill_create_ip 2,openid 需要微信授权获取到 3,每次支付orderNo要不同 openid参考实例: 1,授权链接地址:...

    session的使用

    另外,还可以直接调用 `request.getSession()` 方法,这等同于调用 `request.getSession(true)`。 ##### 使用 在 `javax.servlet.http.HttpSession` 接口中定义了一系列方法,用于操作会话数据: - `void ...

    图片上传并回显插件11111

    .getSession().getServletContext()); MultipartHttpServletRequest multipartRequest = resolver .resolveMultipart(request); MultipartFile file = multipartRequest.getFile("fileList"); 这个file就能...

    Java类写的随机验证码

    1、在JSP页面中用标记应用验证码。 ...HttpSession session = request.getSession(); String rancode = (String)session.getAttribute("random"); if(code.equals(rancode)){//判断用户输入的对否

Global site tag (gtag.js) - Google Analytics