在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)。
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时,
//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时,
LoginFalse.loginFalse(request);
即:调用了LoginFalse类里面的俄静态方法,当然是自己写的,最近刻意养成把所有的东西给封装的习惯,感觉不错。LoginFalse里面的代码,
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的代码,
<%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代码,
<%String u = (String) session.getAttribute("truename");%>
<%=u%>
<%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有点不同,就在这:
HttpSession session = request.getSession();
session.setAttribute之前必须得注意写上这一行。
转自
http://www.cnblogs.com/lingxue3769/archive/2010/12/21/1912661.html
分享到:
相关推荐
2. 在检查 Session 中是否存在某个变量或标记时,未使用 getSession(false) 方法,从而导致不必要的会话创建。 最佳实践 为了避免上述错误,可以遵循以下最佳实践: 1. 在使用 getSession() 方法时,明确指定 ...
`request.getSession()`方法及其变体是其中的关键之一,用于获取或创建与当前请求关联的`HttpSession`对象。本文将深入探讨`request.getSession(true)`、`request.getSession(false)`以及`request.getSession(null)`...
`request.getSession()`方法默认会创建一个新的会话,如果当前请求中还没有会话。它等同于`request.getSession(true)`,意味着如果不存在当前的会话,它将自动创建一个新的。这意味着每次调用此方法,只要没有现成的...
HttpSession session = request.getSession(); ``` - **会话对象的生命周期:** - 会话对象通常生存于服务器端。 - 服务器会自动通过Cookie或URL重写与客户端建立关联。 - `getSession()`方法会在没有找到现有会话...
而`request.getSession(false)`会返回当前线程中的现有Session,如果没有则返回`null`,避免了不必要的Session创建。 在实际开发中,定期检查Session的有效性,特别是在处理敏感操作时,可以防止因Session过期导致...
如果没有当前会话对象,request.getSession() 方法将创建一个新的会话对象。request.getSession(false) 方法用于获取当前会话对象,如果没有当前会话对象,将返回 null。request.getSession(true) 方法用于获取当前...
request.getSession().setAttribute("currentUser", user); ``` 2. **创建登录过滤器**:创建一个新的类,实现Filter接口,并重写doFilter()方法。在这个方法中,我们可以检查Session中是否存在用户数据。 3. **...
String sessionId = request.getSession().getId(); // 获取当前Session ID HttpSession session = request.getSession(false); // 获取Session,如果不存在则返回null if (session != null) { // Session存在,...
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...
在JSP中,九大隐式对象是由服务器自动创建并提供给每个JSP页面的,包括request、response、session、application、page、pageContext、out、config和exception。 七、Forword(请求转发)与Redirect(重定向) Forword...
使用request.getSession()方法可以获取当前请求的session对象,然后可以通过getAttribute()方法获取session中的值,例如:<%=request.getSession().getAttribute("sessionid"); %>。这种方法也可以获取session的值,...
`request.getSession().getCookies()`:Session没有提供直接获取Cookies的方法。 - D. `request.getSession().GetAttributes()`:获取会话范围内的属性,而非Cookies。 - **答案**:A #### 四、Servlet初始化...
//得到书号和书本对象 ...// System.out.println("SESSION===================>"+request.getSession().getAttribute("shoppingCart")); request.getRequestDispatcher("listcart.jsp").forward(request, response);
`request.getSession().setAttribute(name, value);` - 正确,将对象放入当前请求的session中。 - D. `servlet.getServletContext().setAttribute(name, value);` - 错误,这个方法用于在ServletContext范围设置...
request.getSession().setAttribute("captchaCode", code.toLowerCase()); } ``` 2. 验证码校验:在用户提交表单时,从请求中获取输入的验证码并与Session中存储的验证码进行对比,判断是否一致,从而完成验证码的...
- `getSession(true)`:如果不存在会话,则创建一个新的会话并返回。 #### 十一、Page和PageContext的区别 - **Page**:通常指JSP页面本身。 - **PageContext**:表示页面上下文,用于获取其他隐式对象。 #### ...
request.getSession().setAttribute("uniqueKey", "uniqueValue"); // 处理业务逻辑 // ... request.getSession().removeAttribute("uniqueKey"); return SUCCESS; } ``` 2. 在拦截器或过滤器中检查Session属性...
`request.getSession().getCookies()`:Session对象没有提供直接获取Cookie的方法。 - D. `request.getSession().GetAttributes()`:同B选项,用于获取Session范围内的属性值。 ### 2. 在页面中使用JavaBean 在...