文档章节

java getSession

Oscarfff
 Oscarfff
发布于 2016/02/16 13:53
字数 686
阅读 37
收藏 0

本文属于本人原创,转载请注明出处:http://blog.csdn.net/xxd851116/archive/2009/06/25/4296866.aspx

【前面的话】

在网上经常看到有人对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] view plaincopy

  1. HttpSession session = request.getSession();   // a new session created if no session exists, 哈哈!完蛋啦!如果session不存在的话你又创建了一个!  

  2. String user_name = session.getAttribute("user_name");  

需要注意的地方是request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则尽量使用request.getSession(false)。在使用request.getSession()函数,通常在action中检查是否有某个变量/标记存放在session中。这个场景中可能出现没有session存在的情况,正常的判断应该是这样:

[java] view plaincopy

  1. HttpSession session = request.getSession(false);  

  2. if (session != null) {  

  3.     String user_name = session.getAttribute("user_name");  

  4. }  


【投机取巧】:

如果项目中用到了Spring(其实只要是Java的稍大的项目,Spring是一个很好的选择),对session的操作就方便多了。如果需要在Session中取值,可以用WebUtils工具(org.springframework.web.util.WebUtils)的getSessionAttribute(HttpServletRequest request, String name)方法,看看高手写的源码吧:哈哈。。

[java] view plaincopy

  1. /** 

  2.  * Check the given request for a session attribute of the given name. 

  3.  * Returns null if there is no session or if the session has no such attribute. 

  4.  * Does not create a new session if none has existed before! 

  5.  * @param request current HTTP request 

  6.  * @param name the name of the session attribute 

  7.  * @return the value of the session attribute, or <code>null</code> if not found 

  8.  */  

  9. public static Object getSessionAttribute(HttpServletRequest request, String name) {  

  10.     Assert.notNull(request, "Request must not be null");  

  11.     HttpSession session = request.getSession(false);  

  12.     return (session != null ? session.getAttribute(name) : null);  

  13. }  

注:Assert是Spring工具包中的一个工具,用来判断一些验证操作,本例中用来判断reqeust是否为空,若为空就抛异常。

上面的代码又可以简洁一下啦,看吧:

[java] view plaincopy

  1. HttpSession session = request.getSession(false);  

  2. String user_name = WebUtils.getSessionAttribute(reqeust, "user_name");  

  


本文转载自:http://blog.csdn.net/xxd851116/archive/2009/06/25/4296866.aspx

共有 人打赏支持
Oscarfff
粉丝 72
博文 815
码字总数 96913
作品 0
崇明
后端工程师
SpringMVC之接收请求参数和页面传参

Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name")......

白志华
2015/09/23
0
0
对Hibernate中Session与Thread绑定的一点认识

对Hibernate中Session与Thread绑定的一点认识

java-苦苦甜甜
2012/10/18
0
0
ThreadLocal 与 Request 和 Session 之关联

ThreadLocal 类行是 .NET Framework 4.0 才开始支持的类型,MSDN 的解释只有简单的一句话:提供数据的线程本地存储,其提供的实例代码也不太好,有点为了演示而演示的目的。所以,一眼望去,...

luminji
2014/06/05
0
0
在spring+beranate中多数据源中使用 ThreadLocal ,总结的原理 --费元星

设计模式 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。...

未来星狒狒
2015/09/17
0
0
SpringMVC之后台接收参数与前台传递数据

1、接收请求参数 1. 使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") publicString login(HttpServletRequest request){ String name = request.getParameter("name") St......

Java架构师那些事
08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Laravel UNION联合查询并分页

$xk = DB::table('xiaokes')->select(['id','xk_name as name','xk_teacher_id as tid','ke_type','created_at']) ->where('xk_teacher_id',$id); $query = DB::......

一只懒猫-
33分钟前
1
0
187 修改centos的密码

先登录

Lucky_Me
40分钟前
3
0
通过Timer类实现App 启动页停留三秒效果

Timer timer = new Timer(); //参数1:每次执行的任务代码 参数2:延时多少毫秒执行 参数3:任务间隔 单位:毫秒 timer.schedule(new TimerTask() { @Over...

lanyu96
46分钟前
0
0
pip更改下载源设置

任何一个信息都可以把人分为两类,知道的和不知道的。有些我们已知的信息,自己觉得很平常,却可能对另一些不知道的人来说很有用处。 比如今天要说的这个小技巧,我自己原以为不值一提,网上...

crossin
47分钟前
2
0
css预加载

css /* 预加载图片,挂在body上 */.preload-img:after{ content:""; background: url(../images/new/full_bg2.jpg) no-repeat -10000px -1000px;} js $(function(){ /......

红羊在厦门
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部