码迷,mamicode.com
首页 > 编程语言 > 详细

java学习笔记—会话(24)

时间:2015-04-06 20:16:09      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

 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创建时间的long
long 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(): F8A7BC23A0B403CE30A69F8B5F903D6A
getLastAccessedTime(): 1358385915203
isNew(): true
getCreationTime(): 1358385915203

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

java.lang.IllegalStateException: setAttribute: Session already invalidated

总结:

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

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

java学习笔记—会话(24)

标签:

原文地址:http://www.cnblogs.com/zhenghongxin/p/4396414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!