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

HttpSession用法

    博客分类:
  • 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时,


Java代码
//Struts Bean方法里session的用法   
String login_name = rs.getString("true_name");   
//返回和请求相关的session   
HttpSession session = request.getSession();   
//把truename的属性值login_name保存在session对象中   
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时,

Java代码
LoginFalse.loginFalse(request);  

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

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

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的代码,

Java代码
<%String loginwrong = (String) session.getAttribute("loginfalse");   
if (loginwrong != null) { %>   
<%=loginwrong%>   
<%   
//销毁session   
session.removeAttribute("loginfalse");   
}   
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代码,

Java代码
<%String u = (String) session.getAttribute("truename");%>   
<%=u%><br/>   
<%if (u == null) {%>   
<logic:forward name="g_login"/>   
<%}%>   
<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有点不同,就在这:

Java代码
HttpSession session = request.getSession();  

HttpSession session = request.getSession();

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


分享到:
评论

相关推荐

    HttpSession的使用

    一旦有了`HttpSession`对象,就可以使用`setAttribute(String name, Object value)`方法来存储数据,使用`getAttribute(String name)`来检索数据。这里的`name`是键,`value`是对应的值。如果需要移除某个属性,可以...

    spring websocket获取httpsession

    3. 获取HttpSession:在WebSocket消息处理方法中,我们可以利用`@Principal`注解获取当前登录用户的信息,然后通过`RequestContextHolder`获取`ServletRequestAttributes`,进一步获取HttpSession。 4. 客户端配置...

    WebSocket区分不同客户端两种方法(HttpSession和@PathParam)

    本文将详细探讨两种主要的方法——利用`HttpSession`和`@PathParam`来区分不同的WebSocket客户端。 #### 二、使用`HttpSession`识别不同客户端 ##### 1. 理论基础 `HttpSession`是Java Servlet API中提供的一种...

    利用HttpSession实现Ajax请求重定向.docx

    在本文中,我们将探讨如何使用 HttpSession 实现 Ajax 请求重定向。 Ajax 请求是一种常用的技术,用于从服务器请求数据并更新页面内容。但是,在某些情况下,我们需要在 Ajax 请求成功后重定向到新的页面,以便显示...

    HttpSession基于Redis,支持RESTful API .zip

    透明- RedisHttpSession 允许直接使用 HttpSession API,而 redis 的神奇工作是完全透明的。快速入门maven&lt;dependency&gt; &lt;groupId&gt;...

    Web_4_状态管理Cookie和HttpSession1

    总的来说,本章节涵盖了状态管理的基本概念,Cookie的创建、查询、修改和生命周期,以及HttpSession的使用。学习者应该掌握这些内容,以便在实际的Web应用开发中有效地处理客户端和服务器之间的状态保持。

    HttpSession/session,jsp,servlet——综合练习题一

    为了解决这个问题,Web开发者使用`HttpSession`来跟踪用户状态。通过调用`session.setAttribute()`方法,我们可以将对象绑定到会话中,然后在后续的请求中使用`session.getAttribute()`获取。会话通常基于一个唯一的...

    ServletHttpSession DEMO

    在Java Servlet API中,`javax.servlet.http.HttpSession` 接口提供了创建和管理会话的方法。它允许服务器为每个用户分配一个唯一的ID(session ID),并将其存储在用户的Cookie或URL重写中,以便在后续请求中识别...

    servletapi.rar_HttpSession jar_Java jar包_javaee.jar_servletAPI

    通过调用HttpServletRequest对象的getSession()方法,开发者可以创建或获取到一个HttpSession实例。 2. **Java JAR包**: JAR (Java Archive) 文件是一种归档格式,用于打包Java类和其他资源,便于分发和执行。在...

    java使用websocket,并且获取HttpSession 源码分析(推荐)

    描述: 本文主要介绍了 Java 使用 WebSocket 并获取 HttpSession 的方法,通过配置源码分析了各方面知识点,具体操作步骤大家可查看下文的详细讲解。 标签: Java WebSocket Java WebSocket 客户端 获取 ...

    java使用HttpSession实现QQ访问记录

    综上所述,`java使用HttpSession实现QQ的访问记录`是一个简单的实例,演示了如何使用`HttpSession`进行会话管理,并在多个请求之间保持状态。实际项目中,还需要考虑更多因素,如安全性、性能优化以及会话管理策略等...

    Web应用安全:HTTPSession.pptx

    在 Servlet 中,可以使用 request.getSession(boolean create) 方法获取 HTTP 会话对象,其中 create 为 false,若没有和当前 JSP 页面关联的 HTTP 会话对象,则返回 null。 七、HTTP 会话的生命周期 HTTP 会话的...

    jsp中session的用法详解

    jsp 中 session 的使用方法可以帮助开发者追踪用户的操作过程,而不需要担心追踪的实现细节。Session 是一种服务器端的机制,用于存储用户的信息,以便在多个页面之间共享数据。 在 jsp 中, session 是通过 ...

    jsp中session使用方法.docx

    ### JSP中Session使用方法详解 #### 一、引言 在Web开发中,会话管理是一项非常重要的功能,特别是对于需要保持用户状态的应用程序来说更是如此。在Java Web开发中,`HttpSession`接口提供了会话管理的功能,它是...

    session的使用

    使用 `request.getSession()` 方法可以获得 `HttpSession` 对象。 2. **使用**: 在创建 `HttpSession` 对象后,可以使用该对象进行数据的存取,以进行数据的传递。常用的方法包括 `setAttribute` 和 `getAttribute`...

    jsp内置对象的用法

    JSP内置对象是指那些无需声明即可直接在JSP页面中使用的对象。这些内置对象为开发者提供了便捷的方式来处理请求、响应、会话管理以及其他与Web应用程序相关的任务。 JSP提供了九种内置对象,它们分别是:`request`...

    AndroidHttpSession

    使用HttpURLConnection,我们需要设置请求方法(如`setRequestMethod("POST")`)、添加请求头(如`addRequestProperty("Cookie", "sessionID=...")`),以及写入请求体(POST数据)。在接收响应时,可以通过`...

    JavaWeb中HttpSession中表单的重复提交示例

    这个类包含了一些关键方法,如`getInstance()`用于获取单例实例,以及检查请求中的令牌是否与session中的匹配。 在自定义的`TokenProcessor`类中,通常会有一个`TOKEN_KEY`常量用于存储在session中的键名,还有一个...

    jsp中session使用方法

    ### jsp中session使用方法详解 #### 一、引言 在Web开发中,会话管理是一项非常重要的功能,特别是对于需要保持用户状态的应用程序来说更是如此。在Java Web开发中,`HttpSession`接口提供了在多页面请求之间保存...

    Servlet实现猜数字大小游戏

    可以使用`HttpSession`的`getAttribute`和`setAttribute`方法。 6. **构建HTML页面**:在`WebRoot`目录下,创建一个HTML页面,作为用户交互的界面。页面上有一个表单,用户可以输入他们的猜测,并提交到Servlet。 ...

Global site tag (gtag.js) - Google Analytics