美文网首页
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技术简介

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