cookie和session

怎么让网站知道你之前访问过?

  1. 服务器给客户端发送一个信件(cookie),下次客户端再来的时候带着信件来服务器就知道了

  2. 服务器记录客户端的信息,下次过来的时候服务器再匹配(会话session)

    • cookie 客户端技术 通过request得到客户端信息
    • session 服务器技术 通过servletcontext保存信息在这里插入图片描述
      在这里插入图片描述
public class TestCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Content-Type", "text/html");
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();

//获取客户端带过来的cookie
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (int i = 0; i < cookies.length; i++) {

                Cookie cookie = cookies[i];
                //        获取cookie的名字
                String name = cookie.getName();
                //把cookie的有效时间设置为1天
                cookie.setMaxAge(24*60*60);
                //如果cookie的名字是服务端上次给客户端的名字就
                if (name.equals("lastlogintime")){
                    out.write("你上次访问的时间是:");
                    String time = cookie.getValue();
                    long t = Long.parseLong(time);
                    Date date = new Date(t);
                    out.write(date.toLocaleString());
                }else {
                    out.write("您是第一次访问网站");
                }

            }
        }

//创建一个cookie
        Cookie cookie = new Cookie("lastlogintime",System.currentTimeMillis()+"");
//        将cookie送给客户端
        resp.addCookie(cookie);
    }
<servlet>
    <servlet-name>cookie</servlet-name>
    <servlet-class>com.n.TestCookie</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>cookie</servlet-name>
        <url-pattern>/c</url-pattern>
    </servlet-mapping>

删除cookie

  1. 把cookie的有效时间设为0
  2. 不设置有效时间的情况下关闭浏览器结束会话,cookie就失效了
public class delCookie extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建一个名字为lastlogintime的cookie,并把它的有效时间设置为0(就把刚刚那个cookie给删除了)
        Cookie cookie = new Cookie("lastlogintime", System.currentTimeMillis()+"");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }
<servlet>
    <servlet-name>delcookie</servlet-name>
    <servlet-class>com.n.delCookie</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>delcookie</servlet-name>
    <url-pattern>/d</url-pattern>
</servlet-mapping>

转码,解码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKg0VF6q-1650469419802)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220226234605677.png)]

保存位置
  • 一般保存在本地 用户目录的appdata;

细节:一个网站的cookie是否存在上限

  1. 一个cookie只能保存一个信息
  2. 一个web站点可给浏览器发送多个cookie,最多20个
  3. cookie大小限制4kb
  4. 300个cookie浏览器上限

session

什么是session:

  • 服务器会给每一个用户(浏览器)创建一个session对象
  • 一个session独占一个浏览器,只要session没有关闭就session就存在
  • 用户登录后,整个网站里面的所有页面都可以使用,–》保存用户的信息,保存购物车的信息

一个session独占一个浏览器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYicTnag-1650469419804)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220227183932912.png)]

public class TestSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        //进入网站后服务器自动给客户端一个session,现在先get一个session
        HttpSession session = req.getSession();
        //给session存一个东西
        session.setAttribute("name","妮妮");
        //获取session的id
        String sessionId = session.getId();
        //判断session是不是新生成的
        if (session.isNew()){
            resp.getWriter().write("session创建成功了,sessionid:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在了"+sessionId);
        }
//session创建的时候做了什么
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
public class TestSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        //进入网站后服务器自动给客户端一个session,现在先get一个session
        HttpSession session = req.getSession();
        //给session存一个东西
        session.setAttribute("name",new Person("妮娜",18));
        //获取session的id
        String sessionId = session.getId();
        //判断session是不是新生成的
        if (session.isNew()){
            resp.getWriter().write("session创建成功了,sessionid:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在了"+sessionId);
        }
//session创建的时候做了什么
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);
    }
public class getSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
public class getSession2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        HttpSession session = req.getSession();
        Person name = (Person) session.getAttribute("name");
        System.out.println(name.toString());
    }

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

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {

    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class delSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
//        移除掉保存的数据
        session.removeAttribute("name");
//        删除session
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}
   <servlet>
        <servlet-name>TestSession</servlet-name>
        <servlet-class>com.n.TestSession</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestSession</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>getSession</servlet-name>
        <servlet-class>com.n.getSession</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getSession</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>delSession</servlet-name>
        <servlet-class>com.n.delSession</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>delSession</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>getSession2</servlet-name>
        <servlet-class>com.n.getSession2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getSession2</servlet-name>
        <url-pattern>/s4</url-pattern>
    </servlet-mapping>
</web-app>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OU42ZU8x-1650469419805)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220227212344925.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpKlNEqN-1650469419807)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220227205010833.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPUiT8zW-1650469419808)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220227184644729.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lERozkyl-1650469419809)(C:\Users\11751\AppData\Roaming\Typora\typora-user-images\image-20220227204236237.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值