JavaWeb-会话管理笔记

这篇博客主要总结常见的四种会话管理方式

1.URL重写

        将一个或者多个token添加到URL的查询字符串中汇总,每个token通常为key/value格式

通常为 url?key-1=value-1&key-2=value-2&.......

URL重写适合于tokens不需要在太多URL间传递的情况,存在一些限制限制

1、URL在某些浏览器上有长度限制

2、如果进行资源之间的值传递,需要把值插入到链接中,所以在静态页面上很难完成传值

3、URL重写需要在服务端上完成, 所有的链接都必须带值, 因此当一个页面存在很多链接时, 处理过程会很麻烦

4、某些字符,图片必须使用base64编码

5、不能使用户的所有信息都显示到了URL中

URL重写适合信息在少量页面之间传递,且不能带有敏感信息

注:URL重写不支持Cookie

​不同的Web服务器有不同的URL重写规则,不是完全一样的

使URL易于被搜索引擎收录,隐藏真实URL,提高安全性

2.隐藏域

​        隐藏域类似于URL重写技术,但不是把信息放在URL上,而是把信息放在HTML表单的隐藏域中,表单提交时,隐藏域的值也同时提交到服务器端,隐藏技术仅当网页有表单时有效,该技术相对于URL重写的优势在于:没有字符数的限制,不需要额外的编码。但是和URL重写技术一样,不适合多页面之间的信息传递,通俗点来说就是:提交的信息不在提交的界面显示

在提交时使用的表单为

<form action="music.html" method="get">
    <input type="hidden" name="name" value="张三">
    <input type="submit" value="提交">
</form>

在提交的时候我们是看不见“hidden”的属性框的,但是,value=“张三” 这个信息已经默认随着请求被发送给服务器端了,在处理表单的Servlet中使用 request.getParameter("name");就可以获取到提交的信息了。

3.Cookies

URL重写和隐藏域需要在每个页面都进行相应的处理

Cookies是一个很少的信息片段,可以自动的在浏览器和Web服务器之间进行交互,所以Cookies可以在多个页面中传递信息,Cookies时HTTP header的一部分,传输由HTTP协议控制。Cookie也是key-value的格式,存在有效时间,浏览器一般来说支持每个网站20个Cookies

用户也可以通过设置浏览器拒绝接收Cookies或者人为的清除Cookies

1.生成Cookie

//创建Cookie 
Cookie cookie = new Cookie("name", "zhangsan");
//HTTP响应时会将Cookie信息返回给浏览器 
response.addCookie(cookie);

2.获取Cookie

Cookie[] cookies = request.getCookies();
Cookie Acookie = null;
if (cookies != null) {
    for (Cookie c : cookies) {
        if (c.getName().equals("name")) {
            cityCookie = c;
        }
    }
}

这样就可以取得Cookie中存储的value值

String cityName = Acookie != null ? Acookie.getName() : "";

3.删除Cookie

        Cookie没有特定的删除方法,不过Cookie是有过期时间的,一般来说,删除Cookie

的方法是把Cookie的值设置为0秒,所以Cookie会立即过期,也就是删除

//先创建一个Cookie
Cookie rmCookie = new Cookie("name", "aaa");
//通过该方法设置Cookie的有效时间,单位是秒
rmCookie.setMaxAge("0");
//Cookie是由HTTP响应返回给浏览器的
response.addCookie(rmCookie);

这样Cookie就会被删除了,其实也是可以在浏览器中手动删除的

4.HttpSession

Session的格式为key-value类型

一个用户有且只能有一个HttpSession,并且其他用户无法访问到此Session

HttpSession对象 是在用户第一次访问网站的时候自动创建的,Session由服务器端创建

获取Session的方法如下

//返回当前的HttpSession,如果没有就创建一个
1.HttpSession session = request.getSession()/(true);
//返回当前的HttpSession,如果没有返回null
2.HttpSession session = request.getSession(false);

Session的赋值代码如下

//setAttribute方法的第一个String类型作为key,第二个参数的Object类型,作为value
httpSession.setAttribute(“name”,"zhangsan");
httpSession.setAttribute("age",18);
//现在Session中存在name和age属性,属性的内容为zhangsan和18

HttpSession存储数据的要求

1.和URL重写/隐藏域/cookie不同,Session中的值是会存储在内存中的,所以不要往Session中放太多对象或者大对象,尽管现代的 Servlet容器在内存不够用的时候会将保存在 HttpSessions 的对象转储到二级存储上, 但这样有性能问题, 因此小心存储
​
2.放到HttpSession的值不限于String类型, 可以是任意实现 java.io.Serializable 的java对象,因为Servlet 容器认为必要时会将这些对象放入文件或数据库中,尤其在内存不够用的时候,当然也可以将不支持序列化 的对象放入HttpSession, 但是这样的话,当Servlet容器视图序列化的时候会失败并报错

HttpSession内部实现会话跟踪的原理

Session对象是存储在服务器端的,所以Session中的数据不会被发送到客户端,和其他的会话技术不同,Servlet容器为每一个HttpSession生成唯一标识,将该标识发送给浏览器,或者,创建一个名为JSESSIONID的cookie,或者在URL后加入一个名为jsessionid的参数,在后续的请求中,浏览器会把标识提交给服务端,这样服务器就会知道请求是由那个用户发起的。以上步骤为Servlet容器自动完成,不需要开发人员介入

获取JESSIONID的代码(获取到Cookie的key值)

String jsessionId= httpSession.getId();

HttpSession的有效性

Session是储存在服务器端的内存中的,如果用户的会话结束了,可以在代码中人为的设置HttpSession过期

httpSession.invalidate();

这样操作的话,当退出登陆的时候Session就会直接被清除掉了

但是如果出现用户直接关闭浏览器等非正常途径退出,作为服务器端是很难知道用户的会话情况的,这个时候和Cookie一样,也要设置一个Session的有效时间,时间一到Session也会被自动清除掉。

//HttpSession在用户30分钟之内无活动,设置过期, 单位秒
//设置为0,表示永不过期
httpSession.setMaxInactiveInterval(60 * 30);

HttpSession是占用堆内存的,除非Web应用重新加载或者Servlet关闭。所以不建议设置为永不过期

也可以在web.xml中进行配置

<session-config>
<session-timeout>20</session-timeout>
</session-config>

注意:时间的单位为分钟,不配置的话,使用的是Web容器默认的配置,例如Tomcat默认30分钟

Cookie和Session:

​Cookie机制:

    当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给用户。
    具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

    若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
    会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式
​
​
session机制:

    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
    当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
    
保存session id 的方式
    1.保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
​
    2.经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
​
cookie 和session 的区别:
​
    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用Cookie。
    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

以上就是基本的总结,仅供本人学习使用。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/82153412