Cookie和Session


前言

提示:个人笔记,下面案例可供参考

一、cookie

什么是cookie?
	Cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或Cookie没有失效,那么,保存在其中的会话状态就有效。
	用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以相应的形式发送给客户端。客户端收到这个响应后,将cookie保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的cookie数据,发送到服务器,由服务器对会话进行跟踪。
	Cookie是由若干个键值对构成,这里的键一般称为name,值成为value。cookie中的键值对均为字符串。
服务器生成cookie:

代码如下(示例):

public class CookieDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 创建2个cookie
        Cookie cookie1 = new Cookie("demoName1", "demoValue1");
        Cookie cookie2 = new Cookie("demoName1", "demoValue1");

        // 指定cookie绑定的路径。(必须加上req.getContextPath())项目名称
        cookie1.setPath(req.getContextPath() + "/aaa/bbb/ccc");
        cookie2.setPath(req.getContextPath() + "/ccc/ddd/eee");

        //设置cookie的有效期(设置有效期后cookie会保存到硬盘中),单位为秒
        cookie1.setMaxAge(60 * 60); // 有效期1小时
        cookie2.setMaxAge(60 * 60 * 24); // 有效期1天

        // 响应中添加cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}
服务器获取并解析cookie:

代码如下(示例):

public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求中cookie
        Cookie[] cookies = req.getCookies();
        // 遍历cookie
        for (Cookie cookie : cookies) {
            System.out.println(cookies);
        }
    }
}

二、session

什么是session?
session,即会话,是web开发中的一种会话状态跟踪技术。根cookie不同的是,cookie是将会话状态保存在了客户端,而session是将会话状态保存在了服务器端。
什么是会话?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
服务器创建session写入数据:

代码如下(示例):

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        // getSession()默认为true,如果能获取到就使用,如果没有获取到就创建一个新的session
        //         设置为false表示 如果没有获取到session 就返回null
        HttpSession session = req.getSession();
        // 想session域中写入属性
        session.setAttribute("userName","赵四");

    }
}

服务器获取session数据

代码如下(示例):

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session
        HttpSession session = req.getSession(false);

        String name = null;

        if (session != null) {
            // 从session中读取指定属性
            name = (String) session.getAttribute("userName");
        }

        PrintWriter writer = resp.getWriter();
        writer.println("userName ==" + name);
    }
}
session工作原理:
1.写入session列表
	其实当前应用中的session是以map的形式进行管理的,这个map成为session列表。该map的key为一个32位长度的随机串,这个随机串为JSessionID,value则为session对象的引用。
	当用户第一次提交请求时,服务器servlet中执行到request.getsession()方法后,会自动生成一个map.Entry对象,key为一个根据算法生成的JSessionID,value则为新创建的httpsession对象。

2.服务器生成并发送cookie
	在将session信息写入session列表后,系统还会自动将JSessionID作为name,这个32位长度的随机串位value,以cookie的形式存放到响应头中,并随着响应,将cookie发送到客户端。
3.客户端接收并发送cookie
	客户端接收到这个cookie后,会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的cookie就不会消失。
	当用户提交第二次请求时,会将缓存中的cookie,伴随着请求头部信息,一块发送到服务器。
4.从session列表中查找
	服务端从请求中读取到客户端发送来的cookie,并根据cookie的JSessionID的值,从map中查找对应key所对应的value,即session对象。然后对该session对象的域属性进行读写操作。

session的失效:
session的失效就是session的超时。若某个session在指定的时间范围内一直未被访问,那么session将超时,即为失效。默认session的超时时间为30分钟。这个时间是从最后一个被访问开始计时,在指定的时间内一直未被访问的时长。
	// 使session失效,但失效的session并不为null
        session.invalidate();

cookie禁用后重定向跳转session跟踪( url上会暴漏JSessionID ):
		String uri=request.getContextPath()+"/aaaa";
        // 解决cookie禁用后,session的跟踪问题
        uri=response.encodeRedirectURL(uri);
        response.sendRedirect(uri);

cookie禁用后非重定向跳转session跟踪( url上会暴漏JSessionID ):
		resp.setContentType("test/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        String uri = "aaaa";
        // 解决cookie禁用后,非重定向的session跟踪问题
        uri = resp.encodeURL(uri);
        out.println("<a href=' " + uri + " '>跳转</a>到aaaaa");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值