• session(session的创建、设置、生命周期、特点、数据共享、seeion实现三天免登录)


    1、Session的获取

    (1)无参的方法:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            HttpSession httpSession=request.getSession();
            System.out.println(httpSession.getId());
        }

     请求中无Cookie,但是响应中存在Cookie:

     

     当再次访问该Servlet的时候,请求中存在Cookie,响应中的Cookie已经没有了:

     

    以上为无参的方法获取Session,如果没有Session则创建一个,如果有则直接返回。

    (2)有参的方法:

    参数为false:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            HttpSession httpSession=request.getSession(false);
            System.out.println(httpSession.getId());
        }

    如果有Session则直接返回。

    没有的话返回500错误:

     参数为true:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            HttpSession httpSession=request.getSession(true);
            System.out.println(httpSession.getId());
        }

    此方法与不加参数等效。

     2、Session的有效期限:

     前三次访问是连续访问三次CookieServlet,可以看出,SESSIONID的值是不会发生变化的,但是当关闭了浏览器,第四次访问CookieServlet时,SESSIONID发生了变化;第五次为更换了浏览器之后的结果,SESSIOID依旧会发生变化。

    以下情况下Session需要重新建立:

    (1)用户关闭了浏览器。但是关闭了浏览器并不代表Seesion已经被销毁了,因为Session保存在服务器内部。

    (2)关闭了服务器。

    (3)用户没有向服务器提出请求(超过30分钟),过期后服务器自动删除,从不操作服务端资源开始计时。

           可以修改(直接修改或在自己的web.xml中配置,将默认的时间覆盖掉)。

    3、Session的设置:

    (1)时间:

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            HttpSession httpSession=request.getSession(true);
            httpSession.setMaxInactiveInterval(10);//十秒后失效
            System.out.println(httpSession.getId());
        }

    第一次访问,成功返回SESSIONID。

     过十几秒钟后重新访问发现SESSIONID的值已经改变了:

     这是因为第一个SESSIOID已经过期了,需要创建第二个。

    (2)强制失效(手动销毁):

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            HttpSession httpSession=request.getSession(true);
            httpSession.invalidate();
            System.out.println(httpSession.getId());
        }

     即执行invalidate()后可以将创建的SESSION立即结束。

    4、session的特点:

    (1)存储在服务器端。

    (2)依赖于Cookie,借助Cookie存储JSESSIONID。

    (3)存在有效期限。

    5、session的数据共享

    要体现出Session的数据共享,需要建立两个Servlet:

    第一个:建立Session,将值设置为Tom。

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            String name="Tom";
            HttpSession httpSession=request.getSession(true);
            httpSession.setAttribute("name",name);
            System.out.println(httpSession.getId());
        }

    第二个获取Session:

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            HttpSession httpSession=request.getSession();
            System.out.println(httpSession.getAttribute("name"));
        }

     也就是说对于不同的请求,都可以共享Session中的数据,他们的请求针对的是同一个Session,但是要保证Session没有失效。即没有关闭浏览器,没有过期,Session中的数据存储在服务器。

    6、session的应用

    (1)使用Cookie实现的登录的不足:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
            Cookie[] cookies=request.getCookies();
            Connection con=null;
            login log= null;
            int successNum=0;
            try {
                con= C3p0Utils.getConnection();
                QueryRunner qr = new QueryRunner();
                String sql = "Select * from login";
                List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class)));
    
                if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户
    
                    for (int i = 0; i < list.size(); i++) {
                        log= list.get(i);
                    for (Cookie cookie : cookies) {
                            if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){
                               successNum++;
                            }
                    }
                    }
                    if(successNum>=1){
                        response.getWriter().write("Successful login with Cookie!");
                    }
                    else{
                        request.getRequestDispatcher("page").forward(request,response);
                    }
    
                }
                else{
                    request.getRequestDispatcher("page").forward(request,response);//请求转发
                }
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
            response.getWriter().write("<html>");
            response.getWriter().write("<head>");
            response.getWriter().write("<title>");
            response.getWriter().write("Login");
            response.getWriter().write("</title>");
            response.getWriter().write("</head>");
            response.getWriter().write("<body bgcolor="aqua">");
            response.getWriter().write("<center>");
            response.getWriter().write("<h3>");
            response.getWriter().write("欢迎你"+request.getParameter("account"));
            response.getWriter().write("</h3>");
            response.getWriter().write("</center>");
            response.getWriter().write("</body>");
        }

    使用Cookie虽然实现了三天免登录的基础功能,但是,如果在用Cookie登录成功后需要重定向(两次请求,request对象不能携带数据)到另外一个Cookie时,request获取的值在重定向的Servlet中已经不再起作用了,访问的结果只能是空值。

    (2)使用Session的请求共享功能,实现在不同的Servlet跳转过程中依旧能够通过request获得用户信息。

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
            Cookie[] cookies=request.getCookies();
            Connection con=null;
            login log= null;
            int successNum=0;
            try {
                con= C3p0Utils.getConnection();
                QueryRunner qr = new QueryRunner();
                String sql = "Select * from login";
                List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class)));
                if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户
                    for (int i = 0; i < list.size(); i++) {
                        log= list.get(i);
                    for (Cookie cookie : cookies) {
                            if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){
                                HttpSession httpSession=request.getSession();
                                httpSession.setAttribute("login",log);
                               successNum++;
                            }
                    }
                    }
                    if(successNum>=1){
    
                        response.sendRedirect("/Servlet_login_war_exploded/main");//重定向
                    }
                    else{
                        request.getRequestDispatcher("page").forward(request,response);
                    }
    
                }
                else{
                    request.getRequestDispatcher("page").forward(request,response);//请求转发
                }
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    在通过Cookie登录成功后,创建了Session,对Session进行了赋值,而在重定向到MainServlet后,可以从Session中获取值。虽然在不同的Servlet中,是不同的请求,但是依旧能够通过Session获取值。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            login log= (login) request.getSession().getAttribute("login");
            response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
            response.getWriter().write("<html>");
            response.getWriter().write("<head>");
            response.getWriter().write("<title>");
            response.getWriter().write("Login");
            response.getWriter().write("</title>");
            response.getWriter().write("</head>");
            response.getWriter().write("<body bgcolor="aqua">");
            response.getWriter().write("<center>");
            response.getWriter().write("<h3>");
            response.getWriter().write("欢迎你"+log.getAccount());
            response.getWriter().write("</h3>");
            response.getWriter().write("</center>");
            response.getWriter().write("</body>");
        }

     

  • 相关阅读:
    网络管理和nmcli命令的使用——网络接口配置-bonding实验步骤
    raid组合优缺点介绍和创建LVM实验个人笔记
    磁盘分区就是这么简单,电脑小白都能看懂的磁盘分区教程!
    C盘优化之桌面移动法,拯救你爆满的C盘!
    电脑软件打开也有讲究,电脑软件打开方式总结!
    电脑使用建议大全,注意这些细节可以让你的电脑更好用!
    CentOS服务器apache绑定多个域名的方法
    CentOS 7使用yum安装PHP5.6
    PhpMyAdmin 配置文件现在需要一个短语密码的解决方法
    CentOs 7.*中配置安装phpMyAdmin的完整步骤记录
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11558649.html
Copyright © 2020-2023  润新知