会话跟踪技术之HttpSession

 1    HttpSession概述


1.1 什么是HttpSesssion

       javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!

 

1.2 获取HttpSession对象

       HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;

       HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

 

1.3 HttpSession是域对象

       HttpServletRequest、ServletContext,它们都是域对象,HttpSession也是域对象。它们三个是Servlet中可以使用的域对象,而JSP中可以多使用一个域对象PageContext。

       HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;

       ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;

       HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;

 

      下面是session的域方法:

       void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

       Object getAttribute(String name):用来获取session中的数据,当前在获取之前需要先去存储才行,例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;

       void removeAttribute(String name):用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

       Enumeration getAttributeNames():获取所有域属性的名称;

2 session的实现原理

       session底层是依赖Cookie的!我们来理解一下session的原理吧!

       当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。

       当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!

 

       当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。

       当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。

 

3 session与浏览器

      session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命不-1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。

       当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId中到Cookie中发送给客户端。     

       你可能会说,那原来的session对象会怎样?当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,当然你也可以在自己的web.xml中覆盖这个配置!

web.xml

    <session-config>

        <session-timeout>30</session-timeout>

    </session-config>

 

       session失效时间也说明一个问题!如果你打开网站的一个页面开始长时间不动,超出了30分钟后,再去点击链接或提交表单时你会发现,你的session已经丢失了!

 

4 session其他常用API

       String getId():获取sessionId;

       int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session;

       void setMaxInactiveInterval(int interval):设置session允许的最大不活动时间(秒),如果设置为1秒,那么只要session在1秒内不被使用,那么session就会被移除;

       long getCreationTime():返回session的创建时间,返回值为当前时间的毫秒值;

       long getLastAccessedTime():返回session的最后活动时间,返回值为当前时间的毫秒值;

       void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId;

       boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。

 

5 URL重写

       我们知道session依赖Cookie,那么session为什么依赖Cookie呢?因为服务器需要在每次请求中获取sessionId,然后找到客户端的session对象。那么如果客户端浏览器关闭了Cookie呢?那么session是不是就会不存在了呢?

       其实还有一种方法让服务器收到的每个请求中都带有sessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为jSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时也服务器可以通过获取jSessionId这个参数来得到客户端的sessionId,找到sessoin对象。

index.jsp

  <body>

<h1>URL重写</h1>

<a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' >主页</a>

 

<form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post">

    <input type="submit" value="提交"/>

</form>

  </body>

       请求注意,在index.jsp后面使用的是分号,而不是问号,这是服务器对jsessionid这个参数的特殊要求。请求注意,在index.jsp后面使用的是分号,而不是问号,这是服务器对jsessionid这个参数的特殊要求。

       也可以使用response.encodeURL()对每个请求的URL处理,这个方法会自动追加jsessionid参数,与上面我们手动添加是一样的效果。

<a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主页</a>

 

<form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">

    <input type="submit" value="提交"/>

</form>

 

       使用response.encodeURL()更加“智能”,它会判断客户端浏览器是否禁用了Cookie,如果禁用了,那么这个方法在URL后面追加jsessionid,否则不会追加。

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

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

相关文章

Nginx安装教程

1 nginx安装环境 nginx是C语言开发&#xff0c;建议在linux上运行&#xff0c;本教程使用Centos6.5作为安装环境。 --gcc 安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如果没有gcc环境&#xff0c;需要安装gcc&#xff1a;yum install gcc…

Solr--企业级搜索应用服务器

1. 概述 1.1.什么是Solr Solr 是Apache下的一个顶级开源项目&#xff0c;采用Java开发&#xff0c;它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展&#xff0c;并对索引、搜索性能进行了优化。 Solr可以独立运行&…

HttpClient使用详解

1. 什么是httpclient HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了&#xff0c;越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能&#xff0c;但是对于大部分应用程序来说&#x…

Nginx反向代理及负载均衡

1. nginx反向代理 1.1. 什么是反向代理 通常的代理服务器&#xff0c;只用于代理内部网络对Internet的连接请求&#xff0c;客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求&#xff0c;…

SolrCloud详解及搭建

1. 什么是SolrCloud 1.1. 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&am…

Linux下的MySQL安装及卸载

1.1 查看mysql的安装路径&#xff1a; [rootbogon ~]# whereis mysql mysql: /usr/bin/mysql /usr/lib/mysql/usr/share/mysql /usr/share/man/man1/mysql.1.gz 1.2 查看mysql的安装包&#xff1a; [rootbogon ~]# rpm -qa|grep mysql mysql-community-client-5.6.26-2.…

mysql explain用法

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。使用方法&#xff0c;在select语句前加上explain就可以了&#xff0c;如&#xff1a;explain select * from statuses_status where id11;创建测试表&#xff1a;CR…

Linux 性能检查命令总结

如果你的Linux服务器突然负载暴增&#xff0c;告警短信快发爆你的手机&#xff0c;如何在最短时间内找出Linux性能问题所在&#xff1f;

【算法系列之四】柱状图储水

题目&#xff1a; 给定一个数组&#xff0c;每个位置的值代表一个高度&#xff0c;那么整个数组可以看做是一个直方图&#xff0c; 如果把这个直方图当作容器的话&#xff0c;求这个容器能装多少水 例如&#xff1a;3&#xff0c;1&#xff0c;2&#xff0c;4 代表第一个位…

盐城大数据产业园人才公寓_岳西大数据产业园规划设计暨建筑设计方案公布,抢先一睹效果图...

近日&#xff0c;岳西县大数据产业园规划设计暨建筑设计方案公布。岳西县大数据产业园项目总占地面积17014.10㎡(约合25.52亩)&#xff0c;拟建总建筑面积约为61590.84㎡(地上建筑面积39907.49㎡&#xff0c;地下建筑面积21602.35㎡)。以“科技圆环”为主题&#xff0c;组建出一…

【算法系列之五】对称二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3 说明: 如果你可以运用递归和迭代两种方法解决这个问题&a…

cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块

好程序员Python教程系列-第8讲&#xff1a;函数和模块&#xff0c;在讲解本章节的内容之前&#xff0c;我们先来研究一道数学题&#xff0c;请说出下面的方程有多少组正整数解。事实上&#xff0c;上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案&#xff0c;所…

mfc让图片与按钮一起_对许多张图片进行批量裁剪,看看我是如何快速做到的

概要&#xff1a;当我们需要对很多图片进行批量裁剪时&#xff0c;以往的办法是自己一张一张图片去操作&#xff0c;非常麻烦。有没有这样一个工具&#xff0c;能够帮我们批量进行处理呢&#xff1f;之前小编在网上找了非常多的软件&#xff0c;一个一个地安装试用&#xff0c;…

发电厂电气部分第三版pdf_火力发电厂电气主接线的特点

根据火力发电厂的容量及其在电力系统中的地位&#xff0c;一般可将火力发电厂分为区域性火力发电厂和地方性火力发电厂。这两类火力发电厂的电气主接线有各自的特点。一、区域性火力发电厂的电气主接线1、单机容量及总装机容量都较大单机容量多为300MW、600MW和少量1000MW,电厂…

定义一个dto对象_业务代码的救星——Java 对象转换框架 MapStruct 妙用

在业务项目的开发中&#xff0c;我们经常需要将 Java 对象进行转换&#xff0c;比如从将外部微服务得到的对象转换为本域的业务对象 domainobject&#xff0c;将 domainobject 转为数据持久层的 dataobject&#xff0c;将 domainobject 转换为 DTO 以便返回给外部调用方等。在转…

discuz设置用户每天回帖数_[建站教程]Discuz3.4设置QQ互联登陆教程

虽然现在很多人已经不在使用QQ了&#xff0c;但瘦死的骆驼比马大&#xff0c;QQ的用户基数还是很大&#xff0c;而且QQ里有大量的年轻用户&#xff0c;像我的表妹&#xff0c;表弟刚上初中。他们是忠诚的QQ用户。为了获取这批年轻的用户&#xff0c;我们还是有必要让网站支持QQ…

16进制加法 keil_C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制

我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多个数字组合起来。例如表示 58 的结果&#xff0c;一个数字不够&#xff0c;只能”…

MySQL的索引是什么?怎么优化?

索引类似大学图书馆建书目索引&#xff0c;可以提高数据检索的效率&#xff0c;降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降&#xff0c;虽然官方文档说500~800w记录&#xff0c;所以大数据量建立索引是非常有必要的。MySQL提供了Explain&#xff0c;用于显示…

git实现审核功能_一文教你如何搭建PDD分佣小程序实现财富自由

随着拼多多的火爆&#xff0c;很多淘客以各种方式通过推广拼多多商品获取返佣来月入万元&#xff0c;实现财富自由。只要你有流量或者足够努力&#xff0c;像其他淘客一样实现睡后过万财富自由不是梦。本文通过详细教程教你快速搭建属于自己的PDD分佣小程序&#xff0c;完成自己…

9型转x型 cobol_兰州一餐馆推鸳鸯牛肉面 9种面型一面多吃

来源标题&#xff1a;兰州一餐馆推鸳鸯牛肉面&#xff0c;清汤酸菜各一边还有9种面型&#xff0c;网友&#xff1a;能连吃三碗近日&#xff0c;位于甘肃兰州的一家牛肉面馆推出了鸳鸯牛肉面。一个大碗分隔为两边&#xff0c;一边是传统清汤牛肉面&#xff0c;另一边是酸菜牛肉面…