JavaWeb(会话技术 Cookie Session 会话域)

会话技术

会话技术: 为了解决浏览器和服务器数据共享的问题
会话: 就是浏览器和服务器建立的一次连接,在这次连接中,可以包含多次请求和响应,并且再多次请求和响应之间进行数据的共享

客户端会话技术
	数据由客户端保存,Cookie
	原理:
    1.客户端请求一个资源,服务器做出响应时,会发送set-cookie头,共享数据
    2.客户端接收到响应,会将数据保存在客户端浏览器中
    3.客户端再一次请求服务器时,会通过cookie头携带该数据。
    4.服务端接收到请求,会来解析获取数据
	
服务端会话技术
	数据由服务端保存,Session
	原理: 
	session依赖于cookie存在
	当浏览器请求时,服务器会给这个Session对象生成一个唯一编号,叫jsessionid,然后通过set-cookie响应头,让浏览器带回去保存,当浏览器下一次再来请求时,通过cookie请求头把jsessionid带回来,服务器通过jsessionid找到原来那个session对象,然后取出session中的数据

客户端Cookie

Java实现cookie:
发送Cookie//创建Cookie对象
    Cookie cookie = new Cookie("MilkTeaShop","card");
	//设置Cookie的存活时间
	cookie.setMaxAge(60*60*24*3);
    //发送cookie
    response.addCookie(cooike);

接收Cookie//获取所有的cookie
    Cookie[] cookies = request.getCookies();
    //2.遍历
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            //获取cookie的名字
            String name = cookie.getName();
            if ("MilkTeaShop".equals(name)) {
                //获取cookie的值
                String value = cookie.getValue();
                System.out.println(value);
            }
        }
    }

注意事项:
    1.持久化
        默认Cookie是存在浏览器的内存中,也就是说浏览器一关闭就请空掉,这就是Cookie的持久化问题,可以让Cookie存储到磁盘上,进行设置,让Cookie保存到磁盘上,设置Cookie的存活时间
        setMaxAge(int second);
        //正数:存在硬盘上多少秒
        //负数:默认值-1 存在浏览器内存中
        //0:删除cookie
        cookie.setMaxAge(60*60*24*3);

    2.Cookie存储中文
    	Tomcat8.5以上支持中文
    	版本不是8.5以上的不支持中文
    	使用URL编码 解码
        //编码
        Cookie uc = new Cookie("username", URLEncoder.encode(username, "utf-8"));
        Cookie pc = new Cookie("password", URLEncoder.encode(password, "utf-8"));
		//解码
        username = URLDecoder.decode(uc.getValue(), "utf-8");
        password = URLDecoder.decode(pc.getValue(), "utf-8");

	3.Cookie被禁用或阻止的问题
		cookie请求头就带不过去了

服务器端Session–会话域

Session会话域,范围是在一次会话中(浏览器和服务器,这一次都不关闭)这次会话包含了多次的请求和响应

Java实现Session//获取session
HttpSession session = request.getSession();
//存储数据
session.setAttribute("msg", "hehe");
//获取数据
Object msg = session.getAttribute("msg");
//删除数据
session.removeAttribute("msg");
	
Session细节
	1.服务器不关,断开浏览器:
	  当我们第一次请求,建立了会话,往会话域中存了数据,如果我们关闭了浏览器,也就是断开了这次会话,你在打开浏览器,那之前在上一次会话中的数据,就取不到了
	2.浏览器不关,正常关闭服务器:
      能取到数据,服务器有一个钝化和活化机制
      钝化:当正常退出服务器时,服务器会把这次会话对象session序列化到磁盘上保存
      活化:当你再次启动服务器,服务器又会把上次保存在磁盘上的session对象在读回来
    3.session生命周期
      a.创建:当调用request.getSession()
      	会根据jsessionid值查找到session对象,如果没找到,则创建新的session对象,给他分配一个新的jsessionid
      b.销毁:服务器强制关闭
      	正常退出会有钝化机制
      c.手动调用方法销毁:session.invalidate()
      d.session超超时销毁,默认是30分钟,客户端没有任何操作,服务器销毁session
    4.request.getSession()会根据jsessionid值查找到session对象
      request.getSession(true)
      	true默认值,会根据jsessionid值查找到session对象,如果没找到,则创建新的session对象
      	false,会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
    5.如果客户端禁用了 cookie,session该如何自处?
    	●通过url重写,把sessionid作为参数追加的原url中,后续的浏览器与服务器交互中携带sessionid参数。
		●服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数。
		●通过Http协议其他header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段。

        URL重写:http://localhost:8080/sessionExercise/demo;jsessionid=E5F92CFD2B256EE2548AE01CC56B2E62
        
		PrintWriter pw = response.getWriter();
        HttpSession session = request.getSession();
        String id = session.getId();

        String href = "/sessionExercise/demo";
        href = response.encodeRedirectURL(href);
        System.out.println(href);
        pw.write("<a href='"+href+"'>demo</a>");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值