Java Web——Cookie&Session

Cookie/Session(重要)

1. 概论

会话:浏览器从打开到关闭,建立一个会话

2. 保存会话期间信息的俩种技术

Cookie:

客户端技术(响应,请求)

第一次访问服务端向客户端发送Cookie信息,之后客户端每次请求(注意一次访问本身就是一次请求)都携带Cookie,直到会话结束 (会话级)或者生命周期完结(持久级)。

Session(更重要):

服务端技术

服务器中存储Session信息,每个Session有个SessionID,服务器把SessionID保存在Cookie中,客户端每次请求携带Cookie,通过SessionID 得到Session信息。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

3. Cookie详解

3.1 介绍

  1. cookie机制采用的是在客户端保持 HTTP 状态信息的方案。当浏览器访问WEB服务器的某个资源时,WEB服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件可理解为cookie域(键值对的集合),往后每次访问某个网站时,都会在请求头中带着这个网站的所有cookie值。(至于怎么区分不同网站的cookie的,很简单,每个网站都给他一个唯一标识比如网址等,每次打开某网址时,就查询该网站下的所有cookie值即可。)

  1. 简单来说Cookie就是服务端用来保存一些信息(K-V形式键值对)在客户端(浏览器里),一般的Cookie生命周期是一个会话,但也可以设置生命周期使得Cookie存在时间变长。

  2. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB

3.2 Cookie类使用

注意:一个Cookie只能存储一个信息(一个键值对),而且Cookie只能存String类型的数据(有局限性)

 

/*
常见方法
*/
Cookie[] cookies = req.getCookies(); //从请求获取所有Cookie信息,返回Cookie数组
cookie.getName()   //获取Cookie的名称(key)
cookie.getValue(); //获取Cookie的值(value)
resp.addCookie(cookie);//从响应添加Cookie
​
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//创建cookie,一个Cookie一个信息
cookie.setMaxAge(24 * 60 * 60); //设置cookie的有效期,秒为单位

3.3 删除Cookie

Cookie类中没有直接删除的操作,但是可以通过添加相同的Cookie(除了value和maxAge不一样)并设置生命周期(setMaxAge)为0,此时这个Cookie会覆盖原Cookie,从而达到删除Cookie的目的

3.4 Cookie保存中文信息乱码问题

使用Cookie保存中文可能会出现乱码问题使用URLEncode类和URLDecoder类解决问题

Cookie cookie = new Cookie("item1", URLEncoder.encode("中文信息", "UTF-8"));
String decode = URLDecoder.decode(cookie.getValue(), "UTF-8");

4. Session详解

4.1 简单介绍

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

4.2 工作原理

img

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。所以生命周期一般在一个会话。

4.3 HttpSession接口的使用

 

public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();//从请求获取Session
        session.setAttribute("item1","520");//设置属性
        session.setAttribute("item2",new Rectangle(5,20));//值可以是Object
        
        if (session.isNew()){//判断Session是否已经创建了
            resp.getWriter().write("session 创建成功,ID"+session.getId());
        }else {
            resp.getWriter().write("session 已经存在了"+session.getId());
        }
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
//在Demo02中
HttpSession session = req.getSession();//从请求获取Session
session.getAttribute("item1");//此时从另一个servlet程序获取值,实现了数据共享(Cookie也行),而不是用ServletContext
session.getAttribute("item2");
​
session.removeAttribute("item1");//删除属性
session.invalidate();//注销,也可以在web.xml中配置
<!-->注销Session,节省服务器资源,再次访问会再次分配一个新的Session</!-->
<session-config>
    <session-timeout>1</session-timeout><!-->分钟为单位</!-->
</session-config>

5. Cookie和Session的异同

两者的区别:在安全和性能方面考虑

  1. Cookie数据存放在客户端,Session数据放在服务器上。

  2. Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用Session。

  3. Session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用Cookie。

  4. 不同浏览器对Cookie的数据大小限制不同,个数限制也不相同。单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。

  5. 可以考虑将登陆信息重要信息存放为Session不重要的信息可以放在Cookie中。

  6. 就java而言,Cookie存储的是String,Session存储的是Object

两者的联系:

1、都是用来记录用户的信息,以便让服务器分辨不同的用户。

2、可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值