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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值