美文网首页
Web 基础13 Session技术简介

Web 基础13 Session技术简介

作者: 小熊先生很不开心 | 来源:发表于2018-03-30 08:56 被阅读6次

1.1 Session 简介

  • WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象),
  • 如果需要保存用户的数据,我们的程序可以把用户的数据保存在用户浏览器独享的session对象中,
  • 如果用户再次的使用浏览器来访问其他的WEB资源,其他的WEB资源也可以通过session对象来获取这个用户的数据,以便为这个用户再次的服务
  • session对象由WEB服务器创建,我们可以通过请求对象的方法getSession()来获取。

1.1.1 cookie和session的区别

  • cookie
    是一种客户端技术,有大小和数量的限制,把数据保存在客户端,所以相对的不安全
  • session
    是一种服务器端技术,没有大小和数量的限制,把数据保存在服务器端,所以相对的安全
  • 一些思路
    • 如何区分一个session是哪个用户的,这个才是最难
    • 银行 开保险柜 给你钥匙
    • 关键点: 这个钥匙,怎么给到客户 如何让客户每次来的时候都带上钥匙 用的cookie
    • 所以某种意义上 session依赖于cookie id id存在cookie

1.1.2 实现原理

session实现的原理.png
  • 基于cookie

  • 第一次调用 getSession方法 发现客户端没有session对象,就会创建一个新的session对象

  • 并且把session对象id以Cookie的形式发给客户端

  • 客户端再次访问服务器端(severlet),发现他带了一个sessionid,就会查找对应的session对象

  • 如何获得session对象 直接调用 request.getSession() 一定返回一个session对象,我们就可以直接使用

  • getSession()细节

    • 第一次来,没有携带jsessionid ,就创建一个新的session
    • 第二次来,携带jsessionid ,根据这个jsessionid去查找对应的session,如果找到就直接返回
      携带jsessionid,根据这个jsessionid找不到对应的session,重新创建一个session并返回

1.2 Session方法

1.2.1 细节



//获取session对象,如果客户端没有对应的session对象,则创建新的session对象并返回
HttpSession session = request.getSession();

//设置数据
session.setAttribute("username", "wangwu");

//获取数据
session.getAttribute("username");

//删除数据
session.removeAttribute("username");
    

共享对象

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
         * 使用session对象实现数据的共享
         *              域对象,整个会话
         */
        
        //获取session对象
        //获取session对象,如果客户端没有对应的session对象,则创建新的session对象并返回
        HttpSession session = request.getSession();
        
        //获取session对象
        //参数是true,如果客户端没有对应的session对象,则创建新的session对象并返回
        //参数是false,如果客户端没有对应的session对象,则返回null
        //request.getSession(create);
        
        //设置数据
        session.setAttribute("username", "wangwu");
        
        //删除数据
        //session.removeAttribute("username");
        
        //获取数据
        Object obj = session.getAttribute("username");
        System.out.println("SessionDemo2:" + obj);
        
    }
    
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session对象
        HttpSession session = request.getSession();
        //获取数据
        Object obj = session.getAttribute("username");
        System.out.println("SessionDemo3:" + obj);
    
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session对象
        HttpSession session = request.getSession();
        //设置数据
        //session.setAttribute("username", "lisi");
        User user = new User("itheima","qwerty");
        session.setAttribute("user", user);
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session对象
        HttpSession session = request.getSession();
        //获取数据
        //Object obj = session.getAttribute("username");
        //System.out.println(obj);
        
        Object obj = session.getAttribute("user");
        System.out.println(obj);
    }

1.3 案例详解

1.3.1 初始化数据

创建User对象
用户类 User
模拟数据库 UserDB

public class User implements Serializable {
    private String username;
    private String password;
    
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
    
    
    
}

初始化数据

public class UserDB {
    private static List<User> users = new ArrayList<User>();
    
    static {
        users.add(new User("itcast","123456"));
        users.add(new User("itheima","qwerty"));
        users.add(new User("zhangsan","password"));
    }
    
    public static List<User> getUsers() {
        return users;
    }
}

登录页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        //实现登陆页面
        out.println("<html>");
        
        out.println("<head>");
        out.println("<title>登陆页面</title>");
        out.println("</head>");
        
        out.println("<body>");
        out.println("<form action='/mySession/LoginServlet' method='post' >");
        out.println("用户名:<input type='text' name='username' />");
        out.println("<br />");
        out.println("密码:<input type='password' name='password' />");
        out.println("<br />");
        out.println("<input type='submit' value='登陆' />");
        out.println("</form>");
        out.println("</body>");
        
        out.println("</html>");
    }

登录功能

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session实现用户登陆
        //设置响应的类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        //获取用户名
        String username = request.getParameter("username");
        //获取密码
        String password = request.getParameter("password");
        
        //获取所有的用户数据
        List<User> users = UserDB.getUsers();
        //遍历集合
        for (User user : users) {
            //判断用户所输入的用户名和密码是否正确
            if(user.getUsername().equals(username) && user.getPassword().equals(password)) {
                out.println("登陆成功!3秒后跳转到首页!");
                response.setHeader("Refresh", "3;URL=/mySession/IndexUIServlet");
                
                //用户名和密码正确,登陆成功后将用户名添加到session对象中
                HttpSession session = request.getSession();
                session.setAttribute("username", username);
                
                return;
            }
        }
        
        out.println("用户名或者密码不正确!3秒后跳转到登陆页面!");
        response.setHeader("Refresh", "3;URL=/mySession/LoginUIServlet");
    }

注销功能

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        //获取session对象
        HttpSession session = request.getSession();
        
        //删除数据,删除用户在session中的数据
        //session.removeAttribute("username");

        //销毁session对象
        session.invalidate();
        
        out.println("注销成功!3秒后跳转到首页!");
        response.setHeader("Refresh", "3;URL=/mySession/IndexUIServlet");
        
    }

根据session内容响应

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        //获取session对象
        HttpSession session = request.getSession();
        //获取用户的登陆状态
        Object username = session.getAttribute("username");
        
        //实现首页
        out.println("<html>");
        
        out.println("<head>");
        out.println("<title>首页</title>");
        out.println("</head>");
        
        out.println("<body>");
        out.println("<h1>itheima</h1>");
        if(username == null) {
            //username为null,说明session中没有用户的数据,用户没有登陆成功
            out.println("<a href='/mySession/LoginUIServlet' >登陆</a>");
        }
        else {
            //username不为null,session中有用户的数据,用户已经登陆成功了
            out.println("欢迎您" + username);
            out.println("<a href='/mySession/LogoutServlet'>注销</a>");
        }
        out.println("<hr />");
        out.println("</body>");
        
        out.println("</html>");
    }

1.3 Session的补充

1.3.1 session对象的生命周期

  • 一个对象从创建到销毁的整个过程
  • 时间:
    • 创建: 第一次调用getSession()创建Cookie对象
    • 销毁:
      • 超时 默认30分钟(从最后一次请求算起)
      • 手动调用invalidate()方法
      • 非正常关闭服务器


        session对象的生命周期.png

1.3.2 钝化

  • 当我们使用正确的方式关闭tomcat,tomcat会把session对象以及session对象所存储的数据持久化到tomcat的work目录下,
  • 以便tomcat再次启动的时候可以恢复这些数据
  • 使用类封装的时候需要实现序列化接口

相关文章

  • Web 基础13 Session技术简介

    1.1 Session 简介 WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象), 如...

  • spring-session使用教程(一):redis共享se

    1.Spring session简介:说白了就是解决session共享问题,spring-session将web的...

  • Django的Cookie And Session介绍

    Cookie web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术 Django...

  • HTML

    简介 学习web前端开发基础技术需要掌握:HTML、CSS、JavaScript语言。下面我们就来了解下这三门技术...

  • SpringBoot--开发实战--SpringSession会

    一、Spring-session简介   在传统单机web应用中,一般使用tomcat/jetty等web容器时,...

  • EL 表达式&JSTL

    基础目标: 使用 EL 获取 web 四个容器(page、 request、 session、 serveltCo...

  • Http基础三 Post Get

    不清楚CSRF的,可以先看看Http基础一 cookie session token和Http基础二 Web安全简...

  • session深入探讨

    简介 session(会话),其实是一个容易让人误解的词。它总跟web系统的会话挂钩,利用session,java...

  • Session基本应用

    Session简介 Session是服务端技术,利用这个技术。利用这个技术,服务器在运行时可以为每一个用户的浏览器...

  • 关于Cookie和Session的理解

    写在前面 在开始之前,先要理解会话(Session)的含义。Session跟踪是web中常用的技术,用来跟踪用户整...

网友评论

      本文标题:Web 基础13 Session技术简介

      本文链接:https://www.haomeiwen.com/subject/ahebcftx.html