第二章_session管理

第二章_session管理

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

2.1 URL重写

URL重写是Session追踪技术。须要将一个或多个token做为一个查询字符串加入到一个URL中。

Token的格式通常是键=值。

Url?key-1=value-1&key-2=value-2…&key-n=value-n

 

2.2 隐藏域

利用隐藏域来保持状态,与採用网址重写技术类似。但它不是将值加入到URL后面,而是将他们放在HTML表单的隐藏域中。当用户提交表单时,隐藏域的值也传送到server。仅仅有当页面包括表单。或者能够在页面中加入表单时,才适合使用隐藏域。

这样的技术胜过网址重写的地方在于。能够将很多其它的字符传到server。而且不须要进行字符编码。可是像网址重写一样,也仅仅有当要传递的信息不须要跨越多个页面时。才适合使用这样的技术。常见的隐藏域我们用来显示id,这样方便编辑的时候能够依据id获取到值显示出来。

 

2.3 Cookie

Cookie是自己主动在Webserver和浏览器之间来回传递的一小块信息。

Cookie适用于那些须要跨越很多页面的信息。因为cookie是做为HTTP标头嵌入的,因此传输他的过程由HTTP协议处理。除此之外,还能够依据自己的须要设置cookie的有效期限。

对于Web浏览器而言,每台Webserver最多能够支持20cookie

Cookie的不足之处在于,用户能够通过改动他的浏览器设置来拒绝接受cookie

要使用cookie,必须熟悉javax.servlet.http.cookie类,以及HttpServletRequestHttpServletResponse接口中的几个方法。

要创建一个cookie,传递一个名称和一个值给Cookie类的构造器:

Cookie cookie = new Cookie(name,value) ;

比如。要创建一个选择语言的cookie。能够这么写:

Cookie languageSelectionCookie = new Cookie(“language”,”Italian”) ;

创建cookie之后,能够设置他的domainpathmaxAge属性。

尤其值得关注的是maxAge属性,由于它决定cookie的有效期。

httpservletResponse.addCookie(cookie);

当浏览器再次发出对同一个资源或者对同一台server中的不通资源的请求时。它会同一时候把从Web浏览器处收到的cookie再传回去。

要訪问浏览器发出的cookie,能够在HttpServletRequest中使用getCookies方法。该方法将返回一个Cookie数组。假设请求中没有cookie,将返回null。为了找到某个名称的cookie。须要迭代数组。以下举个样例,看看怎样读取一个名为maxRecordscookie

Cookie[] cookies = request.getCookies() ;
		Cookie maxRecordsCookie = null ;
		if(cookies != null){
			for(Cookie cookie:cookies){
				if(cookie.getName().equals("maxRecords")){
					maxRecordsCookie = cookie ;
					break ;
				}
			}
		}

令人遗憾的是,没有getCookieByName方法能够使获取cookie变得更简单一些。

更令人难过的是。也没有方法能够直接删除cookie。为了删除cookie。须要创建一个同名的cookie,将它的maxAge属性设置为0,并在HttpServletResponse中加入一个新的cookie。看看以下是怎样删除一个名为userNamecookie的:

Cookie cookie = new Cookie(“userName”,””) ;

cookie.setMaxAge(0) ;

response.addCookie(cookie) ;

 

2.4 HttpSession对象

HttpSession是当一个用户第一次訪问某个站点时自己主动创建的。

通过在HttpServletRequest中调用getSession方法,能够获取用户的HttpSessiongetSession有两个重载方法:

HttpSession getSession()

HttpSession getSession(boolean create)

无參的getSession方法返回当前的HttpSession。假设当前没有,则创建一个并返回。

getSession(false)方法返回当前的HttpSession(若有),假设没有,则返回nullgetSession(true)方法返回当前的HttpSession(若有),假设没有,则新建一个并返回。

getSession(true)getSession是一样的。

放在HttpSession中的值是保存在内存中的。

加入到HttpSession中的值不一定是String,能够为随意java对象,仅仅要它的类实现了java.io.Serializable接口就可以,以便当Servlet容器觉得有必要的时候,保存的对象能够序列化成一个文件或者保存到数据库中,比如。当容器的内存快要用完的时候。仍然能够将非序列化的对象保存在HttpSession中,可是假设Servlet容器试图将他们序列化,将会以失败告终,并抛出异常。

通过在HttpSession中调用getAttribute方法,同一时候传递一个属性名称,能够获取HttpSession中保存的对象。

这种方法的签名例如以下:

java.lang.Object getAttribute(java.lang.String name)

HttpSession中还有一个实用的方法是getAttributeNames。它返回一个Enumeration,迭代一个HttpSession中的全部属性:

java.util.Enumeration<java.lang.String> getAttributeNames()

注意,HttpSession中保存的值不发送到client,这与其它的Session管理方法不同。而是servlet容器为它所创建的每个HttpSession生成一个唯一标识符。并将这个标识符做为一个token发送给浏览器,通常是做为一个名为JSESSIONIDcookie,或者做为一个jessionid參数加入到url后面。在兴许的请求中。浏览器会将这个token发送回server。使server可以知道是哪个用户在发出请求。不管servlet容器选择用哪一种方式传输session标识符,那都是在后台自己主动完毕的,不须要你去做额外的处理工作。

Java.lang.String getId()

HttpSession中还定义了一个invalidate方法。这种方法强制Session过期,并将绑定到它的全部对象都解除绑定。

在默认情况下。HttpSession是在用户静默一定时间之后过期,能够在部署描写叙述符的session-timeout元素中将session的期限设置为整个应用程序。比如,将这个值设为30,使全部session对象在用户最后一次訪问之后30分钟过期。假设没有配置这个元素。这个期限将由servlet容器决定。

非常多时候,还须要销毁未过期却又无用的HttpSession实例,以便释放一些内存空间。

能够调用getMaxInactiveInterval方法,以了解一个HttpSession在用户最后一次訪问之后还能够维持多久。这种方法返回用户离开的秒数。setMaxInactiveInterval方法能够帮助你为个别HttpSessionSession期限设置一个不同的值。

Void setMaxInactiveInterval(int seconds)

假设向这种方法传递0,那么HttpSession将永远不会过期。

一般来说,这不是一个好方法,由于HttpSession占用的堆(heap)空间将永远不会释放,直到应用程序卸载或Servlet集装箱特写。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117437.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Http 和 Tcp 的区别

    Http 和 Tcp 的区别Http是包装数据的,Tcp是传输数据的。都是先Tcp建立连接,然后传输数据,如果没用http,对方无法识别你传输的数据是什么,所以需要http包装数据,其他应用层协议也可以。

  • linux搭建邮件服务器配置_docker 邮件服务器

    linux搭建邮件服务器配置_docker 邮件服务器Postfix配置并设置账户认证(Postfix+Sasl)记录一下,比较简单的使用安装Postfix系统一般都自带了Postfix,如果不清楚可以使用下面的指令检查rpm-qa|greppostfix如果没用安装Postfix则使用以下指令安装yum-yinstallpostfix安装sasldb、saslauthd用来提供smtp的虚拟账户和密码服务sasldb2包含在saslauthd当中使用指令yum-yinstallcyrus-saslcy.

    2022年10月20日
  • freeswitch之呼叫中心acd模块开发

    freeswitch之呼叫中心acd模块开发一、定义:ACD(AutomaticCallDistributor)自动呼叫分配,也叫智能选择座席。它是呼叫中心整个前台接入系统逻辑功能的描述:把接入的呼叫转接到正确的座席员桌前。ACD是现代呼叫中心有别于一般的热线电话系统和自动应答系统的重要标志,其性能的优劣直接影响到呼叫中心的效率和顾客的满意度。二、ACD包含的功能点:1、程控交换功能ACD在本质上也是交换机的一种类型,必须具有程控交换最基本的话务交换功能。2、排队功能ACD必须具有话务排队的功能,所谓排队是指在内线都

  • 基于Vue3.0的电商后台管理系统—前端

    基于Vue3.0的电商后台管理系统—前端历时一个月,从开始学习vue到能用vue开发一个简单的系统,以下是开发这个系统的简单报告。所用的技术:git:管理代码的开发node.js:vue.js运行环境vue3.0:最新版本vue-cli3.0:脚手架最新版本,支持图形化操作webstorm:代码编辑器项目新增插件:vue-cli-plugin-element:elementUI库项目新增的依赖:…

  • 手机兼容性测试_浏览器兼容性测试工具

    手机兼容性测试_浏览器兼容性测试工具AndroidApp兼容性测试,是一个比较重要的App评价内容说到测试阶段,兼容性测试主要是对App在各类机型上的兼容、适配等情况进行测试。搞清楚这一阶段的测试重点后,因此,AndroidApp在进行兼容性测试前,一定要做好其前序测试内容,否则兼容性测试效果将会较差。1.机型配置问题Android兼容测试一定要做到宽范围覆盖,如果做不到这个,那么就违背了兼容性测试的目标——测试App在各类机型、系统上的运行是否兼容、适配。因此,兼容性测试必须要在各个机型、系统上对App进行运行、测.

    2022年10月26日
  • MyBatisPlus–逻辑删除「建议收藏」

    MyBatisPlus–逻辑删除「建议收藏」逻辑删除开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓欧吉删除就是将数据标记为删除,而并非真正的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询,这样做的目的就是避免数据被真正的删除。配置application.properties#删除状态值为1mybatis-plus.global-config.db-config.logic-del…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号