[05] Session概要


1、Session是什么

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态,即Session是服务器端使用的一种保存客户端状态的机制。Cookie在客户端,Session在服务器端。

围绕以上的概念来说,其实Session还包含不同的语义:

“Session会话”的图片搜索结果
(1)Session会话
我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。即客户端向服务器发送请求,服务器接收请求并生成响应返回给客户端,这样一次连续的调用过程。

从这个语义出发,就涉及到所谓Session持续的时间,以及Session过程中发生了什么操作等。

(2)Session作用域
其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。

从这个语义出发,则涉及到Session中存放什么内容,如何根据键值从Session中获取匹配的内容等。

(Session的实现机制,以及和Cookie的区别,存在的价值,本篇暂不展开,会在后面的文章中单独拿出来解释)

2、HttpSession接口

在Servlet API中,定义了HttpSession接口,用来封装会话对象。

2.1 会话对象的获取

因为该接口类型的对象是由容器创建的,所以不能直接使用new进行创建,而要使用HttpServletRequest中的方法进行获取
  • public HttpSession getSession()  获取当前请求相关的Session,若不存在则新建后返回
  • public HttpSession getSession(boolean create)  若参数为true,则等同getSession();若为false,则Session不存在时返回null,而不会新建

下面是HttpSession接口中定义的部分方法:
返回值    方法名    说明
void    setAttribute(String key, Object value)以key/value的形式保存对象值    
Object    getAttribute(String key)通过key获取对象值
void    removeAttribute(String key)通过key删除属性
int    getMaxInactiveInterval()    获取session的有效非活动时间,以秒为单位
void    setMaxInactiveInterval(int interval)设置session的最大非活动时间,以秒为单位,超时则销毁
String    getId()    获取session对象的编号
void    invalidate()设置session对象失效
boolean    isNew()    判断一个session是不是一个新创建的会话对象

HttpSession中定义了三个与属性相关的方法,get / set / remove Attribute,分别用来 获取 / 设置 / 删除 属性

这三个方法的声明和 HttpServletRequest 中与属性相关的方法是相同的,主要区别在于:
  • 有效范围不同
  • 请求中的属性只在当前请求内有效,只有通过转发才能把当前请求对象转发到下个资源
  • 会话属性在会话对象中有效,即客户端和服务器连接后,只要没有关闭浏览器,服务器也正常,则在该次会话中属性一直有效

另,由于会话对象有效时间长,安全性相对较低,所占资源较多。所以,请求属性能解决的问题,就用请求对象,必须时才使用会话。

2.2 会话失效

会话对象是容器创建的,并保存在容器中。

若客户端连接到服务器后却置之不理,不做任何操作,那么容器维护这些会话对象将占用很多资源。因此,容器会在会话对象闲置默认时间后销毁会话对象多数容器默认30min销毁会话对象。所谓闲置,就是没有使用Session对象。

有三种方式配置会话的失效时间:

(1)在web.xml中配置,如下图配置闲置50min销毁
<session-config> <session-timeout>50</session-timeout>
</session-config>
3
1
<session-config> 
2
    <session-timeout>50</session-timeout>
3
</session-config>

(2)使用setMaxInactiveInterval设置最长有效时间
HttpSession接口提供了setMaxInactiveInterval方法用以设定session的有效时间,以秒为单位,若形参为负数,则表示永不失效。

如设置会话有效时长为2小时:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGet() running...");HttpSession session = request.getSession();session.setMaxInactiveInterval(2*60*60);
}
1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2
    System.out.println("doGet() running...");
3
    HttpSession session = request.getSession();
4
    session.setMaxInactiveInterval(2*60*60);
5
}

如果用以上两种方式同时设置Session的有效时间,则以设定的较小的时间为准

需要注意的是,上面这两种方式还是有区别的:
  • web.xml中配置有效时间是针对当前应用下的所有session,而setMaxInactiveInterval方法只是针对单独的某个session对象
  • web.xml中设置时间单位是min,而setMaxInactiveInterval设置时间单位是sec

(3)使用invalidate立即失效
除了根据有效时间使会话失效之外,还可以调用HttpSession中的invalidate方法,使会话立即失效。

我们在涉及账户登录后常常用到session保存部分用户信息,在用户选择登出时,就要使用invalidate让session失效,以保证用户信息安全,同时提高服务器的效率。


转载于:https://www.cnblogs.com/deng-cc/p/7462894.html

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

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

相关文章

我的学习网站

看到的实用资料记录网址&#xff1a; 1、技术学习网站&#xff1a; http://www.ixpub.net/forum.php 2、禅道项目管理软件(ZenTaoPMS)是一款国产的&#xff0c;基于LGPL协议&#xff0c;开源免费的项目管理软件&#xff0c;它集产品管理、项目管理、测试管理于一体&#xff0c;…

我对组件components 和 页面 views 的思考

之前做过很多项目&#xff0c;我喜欢把组件放到components目录中、页面入口文件放到views中&#xff0c;但哪些文件需要放到components中&#xff0c;哪些文件需要放到views中呢&#xff0c;我现在发现&#xff0c;在自己做很多个项目时&#xff0c;需要尽可能复用组件&#xf…

Android 7.0 获取相机拍照图片,适配三星手机拍照,解决三星手机拍照屏幕旋转,判断设备是否有摄像头

方法1 新建/res/xml/file_paths: <?xml version"1.0" encoding"utf-8"?> <paths xmlns:android"http://schemas.android.com/apk/res/android"><external-path name"external_files" path"."/> </p…

UVA - 10079 Pizza Cutting

/* 主要是画图&#xff0c;画很多图&#xff0c;找规律&#xff0c;找到规律以后&#xff0c;发现算是简单题思路的关键是&#xff1a;每次切割都与前(i-1)刀有交点的情况下&#xff0c;得到的块数是最大的 */ #include <iostream> typedef long long ll; using nam…

Win XP必须禁止的服务

1.NetMeeting Remote Desktop Sharing&#xff1a;允许受权的用户通过NetMeeting在网络上互相访问对方。这项服务对大多数个人用户并没有多大用处&#xff0c;况且服务的开启还会带来安全问题&#xff0c;因为上网时该服务会把用户名以明文形式发送到连接它的客户端&#xff0c…

nuxt2.0 设置 webpack 路径别名

如果想在nuxt中直接使用其他文件的路径&#xff0c;比如下面的components&#xff0c;我们需要在nuxt.config.js进行配置即可。 import SiteHeader from components/site/SiteHeader.vuebuild: {/*** You can extend webpack config here*/extend(config, ctx) {// Run ESLint…

算法前戏 递归 二分查找 列表查找

一、递归 概念&#xff1a; 函数直接或者间接的调用自身算法的过程&#xff0c;则该函数称为递归函数。在计算机编写程序中&#xff0c;递归算法对解决一大类问题是十分有效的。 特点&#xff1a; ①递归就是在过程或者函数里调用自身。 ②在使用递归策略时&#xff0c;必须有一…

nuxt中必须要知道的一点 关于 nuxt-link 和 a 标签的区别

在nuxt项目中可以有两种方式进行路由跳转 1、使用nuxt-link标签 <nuxt-link to"/shop/cart">购物车</nuxt-link>2、使用a标签 <a href"/shop/cart">购物车</a>这两个的区别是 nuxt-link还是在现在的体系中进行加载 a相当于另外打…

android 多选项实现

建集合 private ArrayList<Integer> selectpositionnew ArrayList<>();//Integer可换任何类型 选中就添加入集合 public void onChoose(final int position){selectposition.add(position); } 取消则移除集合 public void onNoChoose(final int position){try {sel…

TCP/IP完整的基础介绍

TCP/IP应该是个协议集&#xff0c;根据OS的七层理论&#xff0c;TCP/IP分为四层&#xff0e;分别是应用&#xff0c;传输&#xff0c;Interne和网络界面&#xff0e; 我们一般说TCP在传输层&#xff0c;而IP在Internet层&#xff0e;TCP/IP的应用程序包括我们平时经常用到的Pin…

使用nuxt

Nuxt.js简单介绍 2016 年 10 月 25 日&#xff0c;zeit.co 背后的团队对外发布了 Next.js&#xff0c;一个 React 的服务端渲染应用框架。几小时后&#xff0c;与 Next.js 异曲同工&#xff0c;一个基于 Vue.js 的服务端渲染应用框架应运而生&#xff0c;我们称之为&#xff1…

配置HAProxy支持https协议

author&#xff1a;JevonWei版权声明&#xff1a;原创作品 实现http重定向到https HAProxy 创建CA证书 [rootHAProxy ~]# cd /etc/haproxy/ [rootHAProxy haproxy]# mkdir certs [rootHAProxy haproxy]# cd /etc/pki/CA [rootHAProxy CA]# (umask 077;openssl genrsa -out priv…

android 万能倒计时,时分秒倒计时

1、工具类 /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;15913707499163.com* 日期&#xff1a;2018/12/28 15*/public class TimerUtil {private static final int nHandlerMsg 23566124;private int nStartDelayTime;private int nIntervalTime;private Timer …

菜鸟必备的网络命令

对于菜鸟的我来讲很有保存价值开始菜单中的“运行”是通向程序的快捷途径&#xff0c;输入特定的命令后&#xff0c;即可快速的打开Windows的大部分程序&#xff0c;熟练的运用它&#xff0c;将给我们的操作带来诸多便捷。 winver 检查Windows版本 wmimgmt.msc 打开Windows管理…

实现瀑布流的核心代码

.warp {column-count: 2;column-gap: 10px;padding: 5px; }.item {height: 80px;margin-bottom: 10px;break-inside: avoid; }效果如下

Mac OS X Terminal 101:终端使用初级教程以及Xcode

转自 http://www.renfei.org/blog/mac-os-x-terminal-101.html 最近学习苹果认证的《Mac OS X Support Essentials》教程&#xff0c;看到 Command Line 一节有很多实用的知识&#xff0c;下面选取一部分翻译 笔记&#xff0c;整理成此文。 你可以整天驾驶汽车而不用知道如何修…