首页 > 学院 > 开发设计 > 正文

java学习笔记—会话2(26)

2019-11-14 23:39:22
字体:
来源:转载
供稿:网友
java学习笔记—会话2(26)

1 使用Cookie实现显示用户的上次访问时间

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {         // 页面输出         response.setCharacterEncoding("utf-8");         response.setContentType("text/html;charset=utf-8");         request.setCharacterEncoding("utf-8");         // 获取字符输出流对象         PRintWriter out = response.getWriter();         // 获取Cookie数组对象         Cookie [] cookies = request.getCookies();         // 定义一个时间的字符串变量         String date = null;         // 定义一个变量存储系统当前日期         Date current_date = new Date();         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");         // 判断是否是第一次登陆         if(cookies != null){             // 直接循环             for(Cookie cookie : cookies){                 // 获取Cookie                 if("lasttime".equals(cookie.getName())){                     // 获取上次访问的时间                     date = cookie.getValue();                      break;                 }else{                     // 获取系统时间                     date = format.format(current_date);                 }             }         }else{             // 获取系统时间             date = format.format(current_date);         }         // 显示时间         out.println(date);         // 将这次访问的时间写入Cookie         Cookie new_cookie = new Cookie("lasttime",format.format(new Date()));          new_cookie.setMaxAge(5*60);         new_cookie.setPath("/day08/showtime");         // 发送         response.addCookie(new_cookie);    }
Cookie细节
  1. 一个Cookie只能存储一种信息。
  2. 一个网站可以发送多个Cookie,浏览器可以同时携带多个Cookie。
  3. 同一个网站最多发送20个Cookie,浏览器最多存储300个Cookie,一个Cookie最多存储数据在4K以内。
  4. 如果创建了Cookie对象没有指定最大有效时间那么不会存储在浏览器的缓存中。
session技术

在上面使用Cookie技术存储会话信息的时候发现Cookie存储的数据有限,而且每次需要客户端浏览器携带数据,导致网络的负载过大。因此如果需要存储相对大量的数据,那么可以直接将数据存储在服务器端,这样可以提高数据的访问速度。

HttpSession技术就是将会话的数据存储在服务器端,便于开发者直接进行访问。

1 HttpSession接口

该接口主要定义了一种区分不同用户并通过request对象获取该对象的实例存储与用户相关的信息的方式。

该接口的对象是tomcat服务器帮助开发者创建出来的,当开发者调用request.getSession()方法获取该接口的对象。

2 常用API

获取HttpSession对象

HttpSession getSession()                 ? 如果有直接返回,如果没有直接创建并返回HttpSession getSession(boolean create)        ? true同上,false有返回,没有null

操作数据

void setAttribute(String name, Object value)     ? 设置指定名的属性值 Object getAttribute(String name)                 ? 获取指定名的属性值Enumeration getAttributeNames()                ? 获取所有属性名的集合迭代器void removeAttribute(String name)            ? 删除指定名的属性

额外的方法

String getId()                             ? 获取Session的ID值boolean isNew()                         ? 判断Session是否是新的long getCreationTime()                     ? 获取Session创建时间的longlong getLastaccessedTime()                 ? 获取最后一次访问Session的时间void invalidate()                        ? 指定Session无效

3 HttpSession的读和写

1. 写Session数据

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {       // 获取session对象       HttpSession session = request.getSession();       // 放置数据       session.setAttribute("name", "jack");    }

发现响应信息中以Set-Cookie: JSESSIONID=8AA06CD311EC6A38805C73C93B8FCE4F; Path=/day08响应头数据将HttpSession对象的ID值以Cookie的方式发送给浏览器进行存储。

2. 读Session数据

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {       // 获取Session对象       HttpSession session = request.getSession();       // 取Session数据       String name = (String) session.getAttribute("name");       // 输出信息       System.out.println(name);}

请求消息中使用Cookie: JSESSIONID=8AA06CD311EC6A38805C73C93B8FCE4F携带了HttpSession对象的ID值,那么服务器根据该值找到对应的HttpSession对象获取其中的值。

总结:

HttpSession技术底层需要借助Cookie存储服务器端为每一个用户创建的HttpSession对象的ID值,便于后面拿到该值获取服务器指定对象中值。

3 重新审视以上代码

可以将获取数据的servlet中的获取sessiond的代码修改如下

HttpSession session = request.getSession(false);

现在实际的浏览器在启动多个同一个浏览器窗口,那么自动使用同一个Session对象。一旦Session的有效时间超过了半个小时那么Session自动销毁。

4 其他的常用方法

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取session对象    HttpSession session = request.getSession();    // 调用常用的方法    System.out.println("getId(): "+session.getId());    System.out.println("getLastAccessedTime(): "+session.getLastAccessedTime());    System.out.println("isNew(): "+session.isNew());    System.out.println("getCreationTime(): "+session.getCreationTime());}

运行结果

getId(): F8A7BC23A0B403CE30A69F8B5F903D6AgetLastAccessedTime(): 1358385915203isNew(): truegetCreationTime(): 1358385915203

如果在以上的代码中使用了 session.invalidate();后继续往session中添加数据,那么服务器报错

java.lang.IllegalStateException: setAttribute: Session already invalidated

总结:

登陆功能分析à 1. 获取用户数据 2. 校验数据 3. 成功,在Session中存储用户登陆的标识

注销功能分析à 1. 清除Session中的用户标识信息 2. 重定向到登陆页面


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表