`
lwt_cedric
  • 浏览: 115320 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

创建session学习-request.getSession()

    博客分类:
  • java
阅读更多

在 HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建。 HttpSession的使用是有代价的,需要占用服务器资源,本着能不浪费就不浪费的原则,我希望系统中的session都在掌握之中,在需要创建时由我们的代码明确创建。但是最近在开发中发现,新的session对象经常在意料之外出现,究竟是谁在创建session呢?

     最常见的地方是错误的使用request.getSession()函数,通常在action中检查是否有某个变量/标记存放在session中。这个场景中可能出现没有session存在的情况,正常的判断应该是这样:

private boolean ifFlagExistInSession(HttpServletRequest request) {
     HttpSession session = request.getSession(false);
     if (session != null) {
         if (session.getAttribute("flagName")   != null) {
             return true;
         }
     }
     return false;
}

     而下面的写法,则可能会生成一个新的不在我们意图之外的session:
private boolean ifFlagExistInSession(HttpServletRequest request) {
     HttpSession session = request.getSession();   // a new session created if no session exists
     if (session.getAttribute("flagName")   != null) {
         return true;
     }
     return false;
}

     注意request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则请尽量使用request.getSession(false)。

posted on 2007-12-19 11:41 飘然 阅读(327) 评论(1)   编辑   收藏 所属分类: web

FeedBack:
# re: 谁在创建session(1)-不恰当的request.getSession()
2007-12-19 15:33 | 隔叶黄莺
一般的(可能有些servlet实现不是这样的),默认的访问用户第一次 jsp 页面就会创建 session 的,因为 jsp 中指令 session 配置为 true,即
<%@ page session="true"%>

编译出来的的 java 文件在 _jspService() 方法中有代码行(Tomcat是这样的)

session = pageContext.getSession();

除非你显示设置
<%@ page session="false"%>
才会让你自己 getSession(true)或 getSession()时创建session

其实创建一个 session 并不耗什么资源,无非就是一个空的map,就是别往里面塞太多的东西,尤其是在集群环境下,会增加同步的负担。

Success时,


   1. //Struts Bean方法里session的用法  
   2. String login_name = rs.getString("true_name");  
   3. //返回和请求相关的session  
   4. HttpSession session = request.getSession();  
   5. //把truename的属性值 login_name保存在session对象中  
   6. session.setAttribute("truename", login_name); 

//Struts Bean方法里session的用法
String login_name = rs.getString("true_name");
//返回和请求相关的session
HttpSession session = request.getSession();
//把truename的属性值login_name保存在session对象中
session.setAttribute("truename", login_name);



False时,


   1. LoginFalse.loginFalse(request); 

LoginFalse.loginFalse(request);

即:调用了LoginFalse类里面的俄静态方法,当然是自己写的,最近刻意养成把所有的东西给封装的习惯,感觉不错。LoginFalse里面的代码,


   1. public static void loginFalse(HttpServletRequest request) {  
   2. String login_false = "Your username or password is wrong!!!";  
   3. HttpSession session = request.getSession();  
   4. session.setAttribute("loginfalse", login_false);  
   5. } 

public static void loginFalse(HttpServletRequest request) {
String login_false = "Your username or password is wrong!!!";
HttpSession session = request.getSession();
session.setAttribute("loginfalse", login_false);
}

在login.jsp的代码,


   1. <%String loginwrong = (String) session.getAttribute("loginfalse");  
   2. if (loginwrong != null) { %>  
   3. <%=loginwrong%>  
   4. <%  
   5. //销毁session  
   6. session.removeAttribute("loginfalse");  
   7. }  
   8. session.removeAttribute("truename"); %> 

<%String loginwrong = (String) session.getAttribute("loginfalse");
if (loginwrong != null) { %>
<%=loginwrong%>
<%
//销毁session
session.removeAttribute("loginfalse");
}
session.removeAttribute("truename"); %>

每页需要用 <%@ include file="inc/logout.inc" %> 来显示用户的true_name以及logout功能实现。
logout.inc代码,


   1. <%String u = (String) session.getAttribute("truename");%>  
   2. <%=u%><br/>  
   3. <%if (u == null) {%>  
   4. <logic:forward name="g_login"/>  
   5. <%}%>  
   6. <html:link page="/login.jsp">logout</html:link> 

<%String u = (String) session.getAttribute("truename");%>
<%=u%><br/>
<%if (u == null) {%>
<logic:forward name="g_login"/>
<%}%>
<html:link page="/login.jsp">logout</html:link>

还有LoginForm里面的not required处理就省略了。
自我感觉这次的问题就出现在,不知道Struts里面scope定义session的话,在Bean里面不人为写session时,struts会自己给个getSession();
还有跟以前在JSP-JSP里面的session有点不同,就在这:


   1. HttpSession session = request.getSession(); 

HttpSession session = request.getSession();


session.setAttribute之前必须得注意写上这一行。

分享到:
评论

相关推荐

    request.getSession().doc

    2. 在检查 Session 中是否存在某个变量或标记时,未使用 getSession(false) 方法,从而导致不必要的会话创建。 最佳实践 为了避免上述错误,可以遵循以下最佳实践: 1. 在使用 getSession() 方法时,明确指定 ...

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

    `request.getSession()`方法及其变体是其中的关键之一,用于获取或创建与当前请求关联的`HttpSession`对象。本文将深入探讨`request.getSession(true)`、`request.getSession(false)`以及`request.getSession(null)`...

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

    `request.getSession()`方法默认会创建一个新的会话,如果当前请求中还没有会话。它等同于`request.getSession(true)`,意味着如果不存在当前的会话,它将自动创建一个新的。这意味着每次调用此方法,只要没有现成的...

    08-Session-Tracking-Chinese.pdf

    HttpSession session = request.getSession(); ``` - **会话对象的生命周期:** - 会话对象通常生存于服务器端。 - 服务器会自动通过Cookie或URL重写与客户端建立关联。 - `getSession()`方法会在没有找到现有会话...

    jsp-63338.pdf

    而`request.getSession(false)`会返回当前线程中的现有Session,如果没有则返回`null`,避免了不必要的Session创建。 在实际开发中,定期检查Session的有效性,特别是在处理敏感操作时,可以防止因Session过期导致...

    于笑扬java综合知识点总结-必背.pdf

    如果没有当前会话对象,request.getSession() 方法将创建一个新的会话对象。request.getSession(false) 方法用于获取当前会话对象,如果没有当前会话对象,将返回 null。request.getSession(true) 方法用于获取当前...

    javaweb-filter.zip

    request.getSession().setAttribute("currentUser", user); ``` 2. **创建登录过滤器**:创建一个新的类,实现Filter接口,并重写doFilter()方法。在这个方法中,我们可以检查Session中是否存在用户数据。 3. **...

    javaweb监听session

    String sessionId = request.getSession().getId(); // 获取当前Session ID HttpSession session = request.getSession(false); // 获取Session,如果不存在则返回null if (session != null) { // Session存在,...

    自己实现的spring-session

    如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...

    java综合知识点总结-必背.doc

    在JSP中,九大隐式对象是由服务器自动创建并提供给每个JSP页面的,包括request、response、session、application、page、pageContext、out、config和exception。 七、Forword(请求转发)与Redirect(重定向) Forword...

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

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

    SCWCD考试模拟题

    `request.getSession().getCookies()`:Session没有提供直接获取Cookies的方法。 - D. `request.getSession().GetAttributes()`:获取会话范围内的属性,而非Cookies。 - **答案**:A #### 四、Servlet初始化...

    基于servlet的购物车

    //得到书号和书本对象 ...// System.out.println("SESSION===================&gt;"+request.getSession().getAttribute("shoppingCart")); request.getRequestDispatcher("listcart.jsp").forward(request, response);

    JSP_Servlet面试题[定义].pdf

    `request.getSession().setAttribute(name, value);` - 正确,将对象放入当前请求的session中。 - D. `servlet.getServletContext().setAttribute(name, value);` - 错误,这个方法用于在ServletContext范围设置...

    kaptcha-spring-boot-starter-master.zip

    request.getSession().setAttribute("captchaCode", code.toLowerCase()); } ``` 2. 验证码校验:在用户提交表单时,从请求中获取输入的验证码并与Session中存储的验证码进行对比,判断是否一致,从而完成验证码的...

    于笑扬java综合知识点总结-必背.doc

    - `getSession(true)`:如果不存在会话,则创建一个新的会话并返回。 #### 十一、Page和PageContext的区别 - **Page**:通常指JSP页面本身。 - **PageContext**:表示页面上下文,用于获取其他隐式对象。 #### ...

    struts2防止重复提交

    request.getSession().setAttribute("uniqueKey", "uniqueValue"); // 处理业务逻辑 // ... request.getSession().removeAttribute("uniqueKey"); return SUCCESS; } ``` 2. 在拦截器或过滤器中检查Session属性...

    jspjspjspjsp

    `request.getSession().getCookies()`:Session对象没有提供直接获取Cookie的方法。 - D. `request.getSession().GetAttributes()`:同B选项,用于获取Session范围内的属性值。 ### 2. 在页面中使用JavaBean 在...

Global site tag (gtag.js) - Google Analytics