IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Servlet学习2:cookie和session -> 正文阅读

[系统运维]Servlet学习2:cookie和session

1.cookie

? ? ? ? 1.1 什么是cookie?cookie(储存在用户本地终端上的数据)_百度百科 (baidu.com)

简单来说,浏览器通过给用户一个cookie的方式,存储一定的信息,代表用户曾经访问过。

? ? ? ? 1.2 cookie 储存信息

自定义servlet类:

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

        PrintWriter out = resp.getWriter();

        resp.setContentType("text/html");

        //获取Cookie对象,由请求(客户端)获得
        Cookie[] cookies = req.getCookies();//可能存在多个cookie

        //判断cookie是否存在
        if (cookies != null){
            //如果存在
            out.print("last visit time is:");

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookie的值
                    String value = cookie.getValue();
                    long lastLoginTime = Long.parseLong(value);
                    Date date = new Date(lastLoginTime);
                    //写出
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.print("this is your first visit");
        }

        //服务器给客户端响应Cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //给cookie设置有效期为1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);//返回上一次登录页面的时间
    }

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

? ? ? ? 对于这个类,只需要知道他的核心功能:记录用户数据。记录用户的上次访问时间,如果没有,则显示this is your first visit;若已经访问过,则返回上次访问的时间。

? ? ? ? 我们来看看Cookie类:

?????????通过new Cookie(String name,String value)来新建cookie对象。注意:值的类型只能是String类型。

? ? ? ? 可以给该cookie设置存在的有效时长setMaxAge(minutes)。

? ? ? ? resp.addCookie(cookie)给响应添加cookie。

? ? ? ? req.getCookies()则是获取所有添加的cookie,可以有多个,返回值为一数组。

? ? ? ? cookie.getValue():取出cookie中的值

就这样我们能向网站中存储cookie、也可以取得他们。下面来一个例子。

servlet类:

public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //新建cookie
        Cookie cookie1 = new Cookie("username", "Helen");
        Cookie cookie2 = new Cookie("password", "Helenxx");

        //response添加cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

        //request获取cookie
        Cookie[] cookies = req.getCookies();
        PrintWriter writer = resp.getWriter();

        //写出
        for (int i = 0; i < cookies.length; i++) {
            writer.write(cookies[i].getValue() + "\n");
        }
    }

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

注册servlet:

<servlet>
        <servlet-name>cookie0</servlet-name>
        <servlet-class>com.leo.servlet.Cookie01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cookie0</servlet-name>
        <url-pattern>/ck1</url-pattern>
    </servlet-mapping>

结果:

? ? ? ? 可见我们所储存的cookie已经成功取出。前2个cookie则是打开浏览器时自带的cookie。

????????1.3 删除cookie

已经储存的cookie,我们可以删除它。只需要用到一个步骤。

自定义servlet类:

public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //要删除的cookie必须与之前的name一致
        Cookie cookie1 = new Cookie("username", "Helen");
        cookie1.setMaxAge(0);
        resp.addCookie(cookie1);
        Cookie cookie2 = new Cookie("password", "Helenxx");
        cookie2.setMaxAge(0);
        resp.addCookie(cookie2);
    }

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

? ? ? ? 要删除某个cookie只需要将他的作用时间设置为0就可以。

注册servlet:

 <servlet>
        <servlet-name>cookie2</servlet-name>
        <servlet-class>com.leo.servlet.CookieDemo2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cookie2</servlet-name>
        <url-pattern>/c2</url-pattern>
    </servlet-mapping>

结果:

? ? ? ? 我们先进入ck1:

?cookie正确取出没毛病。

? ? ? ? 在进入c2:

空白页面。?

? ? ? ? 再进ck1:

可以发现,2个指定的cookie已经删除成功。

2.session?

? ? ? ? 2.1 何为session?

session(计算机术语)_百度百科 (baidu.com),简单来说,一个session就是当用户打开浏览器,访问多个URL连接后,关闭浏览器的过程,只要浏览器不关闭,这个session就一直存在。必须是这个完整的过程。

? ? ? ? 2.2 session储存数据

session也和cookie一样,可以储存数据。不过session中存储数据的保持时间更长。

自定义servlet类:

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

        //解决乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");
        resp.setContentType("text/html,charset=gbk");

        //获取session
        HttpSession session = req.getSession();
        HttpSession session1 = req.getSession();

        //给session存数据
        session.setAttribute("name",new Person("郦道元","男",244));

        //获取session的ID
        String sessionId = session.getId();
        String session1Id = session1.getId();

        resp.getWriter().write(sessionId+"\t"+session1Id);

        //判断session是否为新创建的
        if (session.isNew()){
            resp.getWriter().write("new session id:" + sessionId);
        } else {
            resp.getWriter().write("existed session, id:" + 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);
    }
}

? ? ? ? 首先,通过request.getSession()来获取session对象。可以获取多个session对象。

????????session.setAttribute方法给session存入数据。

?此方法与cookie储存数据不同,通过session储存的数据可以是任何类型,cookie只能是String类型。

? ? ? ? getId方法能够获取该session的id。

注册servlet:

<servlet>
        <servlet-name>session</servlet-name>
        <servlet-class>com.leo.servlet.SessionDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>session</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>

结果:

? ? ? ? ?发现,同一个servlet中,获取的sessionId是相同的,符合session的定义。

? ? ? ? 通过源代码发现,新建session的为?JSESSIONID,也是通过存储在cookie中。所以说创建session时发生了如上代码发生的事。

? ? ? ? 2.3 获取session储存的数据

servlet类:

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

        //解决乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");
        resp.setContentType("text/html,charset=gbk");

        //获取session
        HttpSession session = req.getSession();


        //session在创建时作了什么事?
//        Cookie cookie = new Cookie("JSESSIONID", sessionId);
//        resp.addCookie(cookie);

        Person name = (Person) session.getAttribute("name");
        System.out.println(name);
    }

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

? ? ? ? session.getAtrribute()来获取session储存的值,名称必须与set方法中的对应起来

结果:成功取出。

? ? ? ? ?2.4 清除session存储的数据:

servlet:

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        
    }

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

? ? ? ? 通过session.removeAttribute()方法清除数据,里面填入想清除的name。

注册:

<servlet>
        <servlet-name>session3</servlet-name>
        <servlet-class>com.leo.servlet.SessionDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>session3</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>

结果:先进s1,存入数据;在进入s2查看数据,进入s3清除数据后在进入s2查看:

?

?进不去了,根据错误信息可以看到,刚才存入的数据为null,说明已经被清除了。

? ? ? ? 2.5 清除session

如何让一个session被清除?使用以下方法

session.invalidate();

测试:先进入到s1、然后s3清除,在回到s1:

先进入s1:

?进入s3后在进入s1:

?可以看见2此sessionId不一样。因为之前的session被invalidate方法清除后,再次通过浏览器访问时创建了新的session。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:59:45  更:2021-11-12 20:00:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:59:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码