JavaWeb(三)Cookie和Session

七、 Cookie和Session

7.1 Cookie

百度百科是这样描述cookie的

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。

简单的说,cookie就是一个文件,存着用户和web会话的信息,存在客户端上。当然cookie也有很多自己的规则,例如不能超过4kb、内容为 name/value等等,总之,就是存储在客户端上的一个不超过4kb的小型文本数据,里面保存着用户和web会话的信息

我们可以在Java中拿到cookie对象,并且对它做一些事情,比如,我们可以做一个登录记录提醒,告诉用户上一次访问的时间。

直接上代码:

public class Test01_cookie extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       // 解决乱码问题
       req.setCharacterEncoding("utf8");
       resp.setCharacterEncoding("utf8");
       resp.setContentType("text/html");
       // 获取响应打印流,待会儿往页面上打印信息
       PrintWriter out = resp.getWriter();
       // 获取所有的cookie
       Cookie[] cookies = req.getCookies();
       // 判断有没有记录登录时间的cookie
       boolean flag = false;
       for (Cookie c : cookies) {
           if (c.getName().equals("lastLoginTime")) {
               flag = true;
               break;
           }
       }
       // 如果没有的话,说明是第一次访问,所以把记录登录时间的cookie加进去
       if (!flag) {
           out.println("这是您第一次访问");
           Cookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis()));
           // 设置存活时间,单位为秒
           cookie.setMaxAge(24*60*60);
           resp.addCookie(cookie);
       }
       // 遍历cookie寻找记录登录时间的cookie
       for (Cookie cookie : cookies) {
           // 找到了就将其中的时间输出,然后将这次登录的时间加进去
           if (cookie.getName().equals("lastLoginTime")) {
                   Date date = new Date(Long.parseLong(cookie.getValue()));
                   out.println("您的上一次登录时间是:" + date);
                   cookie.setValue(String.valueOf(System.currentTimeMillis()));
                   cookie.setMaxAge(24*60*60);
                   // 一定要加,不然不生效,我当时在这卡了好久
               	resp.addCookie(cookie);
                   break;
           }
       }
       out.close();
   }
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       doGet(req, resp);
   }
}

别忘了在web.xml中部署这个servlet,这就不赘述了。

7.2 Session

百度百科的解释:

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。

说的太学术了,session给我的感觉就像cookie,不过cookie存在客户端,而session存储在服务器上。

访问web的一瞬间,就会生成一个session,当浏览器第一次访问服务器时,服务器创建一个session对象(该 对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId 以cookie的方式发送给浏览器。 当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据 sessionId就可以找到对应的session对象,session超时会自动销毁,也可以手动销毁。

session中也能存储很多值,不仅可以存字符串,还可以存对象,话不多说,直接在代码中体会session:

// 获取session
public class Test02_session extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // 解决乱码问题
       req.setCharacterEncoding("utf8");
       resp.setCharacterEncoding("utf8");
       resp.setContentType("text/html");

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

       // 在session中存储信息,下一个测试用
       session.setAttribute("username", "哦豁");
       // 获得sessionid
       String sessionId = session.getId();
       // 判断session是否已经创建
       if (session.isNew()) {
           resp.getWriter().println("新的session");
       } else {
           resp.getWriter().println("已有session:" + sessionId);
       }
   }

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

写完之后别忘了在web.xml中部署。

试试效果:

在这里插入图片描述

可以发现cookie中也有sessionid

session也有类似于ServletContext的效果,设置属性后,其他的servlet也可以访问:

public class Test03_session extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决乱码问题
        resp.setCharacterEncoding("utf8");
        resp.setContentType("text/html");
		// 获取sesion
        HttpSession session = req.getSession();
        // 获取username的值
        String username = (String) session.getAttribute("username");
        // 在控制台输出
        System.out.println(username);
    }
}

然后再web.xml中部署,不再赘述。

试试效果:

在这里插入图片描述

成功~

session的销毁

  • 自动销毁

    1. 关闭浏览器自动销毁session
    2. 没有操作一段时间后session自动销毁,如再tomcat中,30分钟不进行操作,session就会自动销毁。
  • 手动销毁

    可以自己设定销毁时间

    修改方式一:

    修改web.xml文件

      <session-config>
        <session-timeout>30</session-timeout>
      </session-config>
    

    意为存活30分钟,如果值 <= 0那么意思就是session不自动销毁。

    修改方式二:

    调用HttpSession的Invalidate方法

    public class Test04_session extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
            // 销毁
            session.invalidate();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    再说一遍,之后不再说

    web.xml!!!

    销毁session后,服务器会立马生成一个新的session。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值