小白学习会话技术Cookie和Session,常用知识

会话技术Cookie和Session

会话:指第一次请求服务器开始建立,会话建立,直到有一方断开为止

功能:在一次会话的范围内的多次请求中,共享数据

方式:

客户端:Cookie

服务器端:Session

一、cookie

1.介绍:

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给浏览器.当用户使用浏览器去访问服务器中的其他web资源时,每次请求都将携带cookie来访问.

2.原理:

  • 客户端发送请求给服务器
  • 服务器发送响应头set-cookie并携带数据给客户端
  • 客户端将响应头携带的数据保存到客户端浏览器中
  • 下一次请求客户端会使用消息头cookie数据携带给服务器
  • 服务器获取消息头中的数据

3.操作:

1).创建Cookie对象

Cookie cookie = new Cookie(String name, String value);
name: 当前Cookie取的唯一名字.
value: 存储在Cookie的共享数据,只能是字符串类型.

2).把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中

response.addCookie(cookie);

3.)获取Cookie及里面的数据

Cookie[] cs = request.getCookie();

4.)修改Cookie中指定的属性名的属性值

A. 重新创建一个新的Cookie,创建一个同名的新的Cookie.
Cookie c = new Cookie(“currentName”, “GZY”);
B. 先获取到要修改的Cookie对象,再调用setValue(String newValue)重新设置
注意:修改Cookie中的数据,需要再次发送给浏览器. response.addCookie©;

4.细节:

1).可以创建多个cookie
2).生命周期:

默认是在关闭浏览器的时候销毁

会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况
持久化Cookie: Cookie可以保存指定的时间段.
设置Cookie的最大存活时间: cookie.setMaxAge(int seconds);

seconds < 0: 关闭浏览器之后,Cookie就销毁了

seconds > 0: 存储指定的秒数.保存到硬盘

seconds = 0: 删除Cookie,

你保存了300s,想提前删除,就直接
cookie.setMaxAge(0);

3).中文问题:

Tomcat8之前不支持中文

4).共享问题

Cookie的路径

同一服务器下不同项目:

Cookie在创建的时候,会根据当前项目的路径来设置自己的路径
问题: 此时,只有在访问路径为/项目路径/下面的资源的时候,才会将该Cookie发送到服务器,一个服务器中其他项目拿不到cookie
解决方案:设置Cookie的路径
void setPath(String uri)
cookie.setPath("/");表示当前服务器的所有的资源都能够共享该Cookie信息
为什么要设置路径,当访问某些页面时,不希望携带cookie.此时就可以设置cookie的携带路径.
路径写法: /项目名称, 所有项目中添加cookie,访问时都会携带.
设置 /项目名称/p, 此时只访问/p时,才携带cookie,其他路径不携带.
不同服务器之间:

可以设置一级域名,这样两个服务器之间可以共享cookie

news.baidu.com
map.baidu.com

cookie.setDomain(“baidu.com”);

5).Cookie的缺陷

1.获取Cookie信息很麻烦
2.Cookie不支持中文
3.一个Cookie只能存储一个字符串类型的数据
4.Cookie的在浏览器中有数量的限制
5.一个浏览器对一个站点最多存储20Cookie信息
6.一个浏览器最多只能够存储300个Cookie
7.共享数据时保存在浏览器中的,容易造成数据的泄露(不安全)

6).作用:

1.一般用于储存少量不太敏感的数据

2.在不登录的情况下,完成客户端身份份识别

5.应用

package com.wangningbo.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author wangningbo
 * @date 2020/6/8 - 21:44
 */
public class HelloCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        boolean flag = false;
        //解决响应到浏览器的中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        //获取浏览器上的所有cookie
        Cookie[] cookies = req.getCookies();
        if (cookies!=null && cookies.length>0) {
            for (Cookie cookie : cookies) {
                if("time".equals(cookie.getName())){
                    flag=true;
                    //因为当初存cookie的value时,是编码过得,要在浏览器上正确显示,所以进行解码
                    String value = URLDecoder.decode(cookie.getValue(), "utf-8");
                    resp.getWriter().write("<h1>欢迎回来,您上次访问时间为"+value+"</h1>");
                    //得到当前时间
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
                    String time = simpleDateFormat.format(new Date());
                    //因为时间格式中有特殊符号,比如空格,这时访问会报500错误,要对它进行编码
                    time = URLEncoder.encode(time, "utf-8");
                    //相当于修改该cookie值为当前时间
                    cookie.setValue(time);
                    //设置浏览器保存cookie的秒数
                    cookie.setMaxAge(100);
                    //修改完cookie要再一次保存
                    resp.addCookie(cookie);
                    break;
                }
            }
        }
        if (cookies==null || cookies.length==0 || flag==false){
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
            String time = simpleDateFormat.format(new Date());
            time = URLEncoder.encode(time, "utf-8");
            Cookie cookie = new Cookie("time", time);
            cookie.setMaxAge(100);
            resp.addCookie(cookie);
            resp.getWriter().write("<h1>这是您的第一次访问</h1>");
        }

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

二、session

1.内容

Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务.总而言之,将数据保存在服务器.

2.Session的特点

  • session 用于存储一次会话的多次请求的数据
  • session 数据存储在服务器中
  • session 可以存储任意类型,任意大小的数据

3.Session的原理

session是依赖于cookie会话技术的

4.Session的操作

1).获取Session对象

request.getSession(): 获取Session对象,如果没有Session对象,直接创建一个新的返回

2).设置共享数据

往Session中存储数据
session.setAttribute(String name, Object value);
从Session中取出数据
Object value = session.getAttribute(String key);

3).删除Session(用户注销登录)
  1. 删除Session中指定属性名的值.
    session.removeAttribute(“currentName”);
  2. 销毁Session对象(Session中所有属性都不存在了)
    session.invalidate();
4).session持久化操作

HttpSession session = request.getSession();
Cookie cookie = new Cookie(“JSESSIONID”, session.getId());
cookie.setMaxAge(60*2);
response.addCookie(cookie);
session.setAttribute(“username”, username);
session.setAttribute(“password”, password);

5.细节

1.session存储数据到服务器端

2.session没有数据大小限制

3.session相比较cookie数据安全

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值