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

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

【前面的话】

在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官网是怎么解释的。 

【官方解释】

  getSession 

public HttpSessiongetSession(boolean create)

Returns the current HttpSession associated with this request or, if if there is no current session andcreate is true, returns a new session.

If create is false and the request has no validHttpSession, 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 ornull 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 plain copy
 print?
  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 plain copy
 print?
  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 plain copy
 print?
  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 plain copy
 print?
    1. HttpSession session = request.getSession(false);  
    2. String user_name = WebUtils.getSessionAttribute(reqeust, "user_name"); 

转载于:https://www.cnblogs.com/meishibiexuejava/p/8563864.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现自定义的未来

上一次我们学习了java.util.concurrent.Future<T>背后的原理 。 我们还发现&#xff0c; Future<T>通常由库或框架返回。 但是没有什么可以阻止我们在有意义的情况下自行实现所有功能。 它不是特别复杂&#xff0c;可以显着改善您的设计。 我尽力为我们的示例选择有…

c语言中的两个百分号什么意思,百分号的用法,特别是在两个量词之间的用法,例如50%—70%和50—70%...-百分号-语文-彭都宰同学...

概述&#xff1a;本道作业题是彭都宰同学的课后练习&#xff0c;分享的知识点是百分号&#xff0c;指导老师为屠老师&#xff0c;涉及到的知识点涵盖&#xff1a;百分号的用法&#xff0c;特别是在两个量词之间的用法&#xff0c;例如50%—70%和50—70%...-百分号-语文&#xf…

Markdown 语法和 MWeb 写作使用说明

# Markdown 语法和 MWeb 写作使用说明 ## Markdown 的设计哲学 > Markdown 的目標是實現「易讀易寫」。> 不過最需要強調的便是它的可讀性。一份使用 Markdown 格式撰寫的文件應該可以直接以純文字發佈&#xff0c;並且看起來不會像是由許多標籤或是格式指令所構成。>…

微信小程序 引入公共页面的几种情况

1、不带参数 首先在pages文件夹中新建一个template文件夹&#xff0c;文件夹中新建一个template.wxml文件&#xff0c;代码如下 <!--template.wxml--> <template name"msgItem"><view><text>This is template.wxml文件&#xff0c;我是一个…

Python学习笔记----基础篇10----模块2

8&#xff09;json& pickle 用于序列化的两个模块 json&#xff0c;用于处理字符串和python数据类型间进行转换 pickle&#xff0c;用于python特有的类型和python的数据类型间进行站换 Json模块提供了四个功能&#xff1a;dumps、dump、loads、load pickle模块提供了四个功…

易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型

自定义数据类型什么是“自定义数据类型”&#xff1f;顾名思义&#xff0c;就是用户可以随时在程序中自行定义新的数据类型。自定义数据类型时需要设置数据类型的名称及其成员。数据类型成员各属性的设置方法等同于变量设置时相应属性的设置方法。双击“程序”中的“自定义数据…

(第2部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

这是以前的文章&#xff08;第3部分&#xff0c;共1部分&#xff09;的继续&#xff1a;有关性能调优&#xff0c;Java中的JVM&#xff0c;GC&#xff0c;Mechanical Sympathy等的文章和视频的提要 。 事不宜迟&#xff0c;让我们开始使用我们的下一组博客和视频&#xff0c;印…

Redis初步整理

1&#xff0c;Redis 简介 Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时…

阶段十-物业项目

可能遇到的错误&#xff1a; 解决jdk17javax.xml.bind.DatatypeConverter错误 <!--解决jdk17javax.xml.bind.DatatypeConverter错误--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>…

echarts中triggeron与trigger不能同时出现吗_好物|痛风、血糖高、虚不受补能吃它吗?你想知道的阿胶十问十答一锅出!...

最近百草君在整理粉丝留言的时候&#xff0c;发现关于阿胶四物膏的留言不少&#xff0c;并且有重复问题。百草君特意整理出来几个粉丝们特别关注的问题&#xff0c;给大家统一解答&#xff0c;顺序不分前后&#xff1a;Q1阿胶四物膏什么口感&#xff0c;甜不甜&#xff1f;阿胶…

【移动端 Web】怎么循序渐进地开发一个移动端页面

1. 移动页面开发基础 1.1 像素——什么是像素 像素是 Web 页面布局的基础&#xff0c;那么到底什么才是一个像素呢&#xff1f; 像素&#xff1a;一个像素就是计算机屏幕所能显示一种特定颜色的最小区域。这是像素的概念&#xff0c;实际上&#xff0c;Web 前端开发领域&…

带有Spring的JavaFX 2

我将从一个大胆的声明开始&#xff1a;我一直很喜欢Java Swing或applet。 在那里&#xff0c;我说了。 如果我进行一些自我分析&#xff0c;那么这种钦佩可能是在我入门Java时开始的。 Swing&#xff08;实际上&#xff09;是我使用Java所做的第一件事&#xff0c;它给出了一些…

c语言怎么样文件存储数据,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

PHP面试题之优化

* PHP性能问题 * 1.PHP语法使用的不恰当 * 2.使用PHP语言做了它不擅长的事 * 3.使用PHP语言链接的服务不给力 * 4.PHP自身做不了的事情 * * PHP的性能问题的解决方向 * 1.PHP语言级的性能优化(代码优化) * 2.PHP周边问题的性能优化(linux,mysql,磁盘等) * 3.PHP语言性能的优化…

3.4 内置函数(1)

3.4转载于:https://www.cnblogs.com/Jermy/articles/10940658.html

c++ 分页展示_分合相宜 Excel透视报表生成分页和汇总报表

我们经常要利用Excel生成指定类型的报表&#xff0c;但是很多报表原始数据是混杂在一起&#xff0c;或者是分布在各个子表中。现在利用Excel透视报表的功能&#xff0c;我们可以快速将混杂的数据分离为分页报表&#xff0c;或者将独立子表整合为汇总报表。简单分页&#xff0c;…

二分法在数组内查找数c语言,C++二分法在数组中查找关键字的方法

本文实例讲述了C二分法在数组中查找关键字的方法。分享给大家供大家参考。具体如下&#xff1a;/*此程序演示了二分法查找算法(针对按从小到大排列的数组)的实现。*/#include using namespace std;/*功能&#xff1a; 实现数组的二分法查找(只算法只适合按从小到大排列的数组)返…

(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

我已经花了几个月的时间考虑审查有关性能调优&#xff0c;JVM&#xff0c;Java中的GC&#xff0c;Mechanical Sympathy等主题的文章和视频的缓存&#xff0c;并最终花了点时间–也许这就是重点我什么时候需要做我的智力进步&#xff01; 感谢Attila-Mihaly给我提供了为其年度时…

【springBoot】之定制Banner

springboot启动时控制台打印图案如下: 1、假如我们不想看到这个图案 public static void main(String[] args) {SpringApplication applicationnew SpringApplication(Application.class);/*** OFF G关闭* CLOSED 后台控制台输出&#xff0c;默认就是这种* LOG 日志输出*/appli…

Web前端体系的脉络结构

Web前端技术由 html、css 和 javascript 三大部分构成&#xff0c;是一个庞大而复杂的技术体系&#xff0c;其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入&#xff0c;然后不断地接触和学习新的知识点&#xff0c;因此对于初学者很难理清楚整…