jsp 对request.getSession(false)的理解(附程序员常疏忽
在网上常常看到开发者对`request.getSession(false)`存在诸多疑问,初次接触时,我也曾感到困惑。参考了J2EE1.3 API以及官网的相关解释后,我对此有了更深入的理解。
【官方解释】
`getSession(boolean create)`这个方法主要是用来获取与当前请求关联的`HttpSession`。如果当前没有会话且`create`参数为`true`,则会创建一个新的会话。当`create`为`false`且请求没有有效的`HttpSession`时,此方法会返回`null`。要确保会话正常维护,必须在提交响应之前调用此方法。如果容器使用cookie来维持会话的完整性,并且在提交响应时被要求创建新的会话,将会抛出`IllegalStateException`异常。
简单来说,`HttpServletRequest.getSession(true)`等同于`HttpServletRequest.getSession()`,当没有会话时会创建一个新的。而`HttpServletRequest.getSession(false)`则意味着如果当前没有会话就直接返回null,不会创建新的会话。
【问题和bug】
我发现许多同事在代码中这样写:
```java
HttpSession session = request.getSession(); // 如果不存在会话则创建一个新的会话
String user_name = session.getAttribute("user_name");
```
这样的写法确实会在没有会话时创建一个新的会话,但这也意味着无意识地创建了不必要的会话,可能造成资源消耗和其他问题。因此需要注意,除非我们确认会话一定存在或者有明确需要创建会话的情况,否则应该尽量使用`request.getSession(false)`。
在检查会话中是否存在某个变量或标记时,通常的做法应该是这样:
```java
HttpSession session = request.getSession(false);
if (session != null) {
String user_name = session.getAttribute("user_name");
}
```
这样做可以避免在没有会话的情况下进行不必要的操作,从而避免潜在的问题。
【投机取巧】
如果项目中使用了Spring框架(实际上,在大多数较大的Java项目中,Spring都是一个很好的选择),那么对会话的操作会变得更加方便。Spring提供了许多简化操作会话的特性和工具,使得开发者能够更加高效地处理会话相关的问题。这不仅可以减少错误的出现,还能提高开发效率和代码质量。如果你想在会话(Session)中取值,使用Spring框架提供的工具可以简化操作。特别是,你可以利用WebUtils工具类中的getSessionAttribute方法。这个方法能够方便地从一个给定的HTTP请求中获取指定名称的会话属性。
这个方法的工作原理是,它首先检查是否存在会话,然后查看该会话是否包含指定的属性。如果会话不存在或者会话中没有该属性,那么它会返回null。值得注意的是,这个方法并不会在没有会话的情况下创建新的会话。
高手们是如何使用这个方法的源码呢?让我们来一起看看。源码大致如下:
```java
public static Object getSessionAttribute(HttpServletRequest request, String name) {
// 确保请求不为空,否则抛出异常
Assert.notNull(request, "Request must not be null");
// 获取当前HTTP请求的会话,如果会话不存在则返回null
HttpSession session = request.getSession(false);
// 如果会话存在并且包含指定的属性,则返回该属性的值;否则返回null
return session != null ? session.getAttribute(name) : null;
}
```
在实际使用中,你可以进一步简化这段代码。例如:
```java
HttpSession session = request.getSession(false); // 获取会话对象
String user_name = WebUtils.getSessionAttribute(request, "user_name"); // 获取会话中的用户名属性
```
以上代码首先从请求中获取会话对象,然后利用WebUtils工具类从会话中获取名为"user_name"的属性值。这种方法在Web开发中非常常见,特别是当你需要从用户会话中获取或设置某些信息时。这种方法的优点在于它简单、直观且易于维护。有关更多信息,你可以参考来自CSDN博客的这篇文章:<
编程语言
- jsp 对request.getSession(false)的理解(附程序员常疏忽
- Ajax+asp.net智能匹配检索(含图含完整代码)
- jQuery实现金额录入框
- php使用PDO获取结果集的方法
- Yii 2中的load()和save()示例详解
- 轻松掌握JavaScript单例模式
- asp是什么格式 asp文件用什么打开
- 浅谈JavaScript异常处理语句
- Vue项目中quill-editor带样式编辑器的使用方法
- Sql Server 2016新功能之Row-Level Security(值得关注)
- MySQL利用procedure analyse()函数优化表结构
- PHP函数import_request_variables()用法分析
- 微信小程序实现登录遮罩效果
- jQuery 实现鼠标画框并对框内数据选中的实例代码
- 四步完成asp网页设计流量统计
- Vue 全家桶实现移动端酷狗音乐功能