zoukankan      html  css  js  c++  java
  • 15 session会话

    1.1.        Session技术

    1.1.1.  Session概述

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

      在浏览器端保存数据,数据可以被查看、获取,数据安全性较低。重要的数据应该存放在不容易获取到的位置。服务器是一个良好的选择。数据通过服务器共享,这门技术就是session会话技术。            

           2. Session工作原理

                  每一个浏览器在访问服务器时,都会创建各自对应的session对象来保存数据。相互之间不会影响,是因为在session对象身上会包含一个sessionid,可以通过这个id来区分每一个浏览器对应的session。

                  a. session工作原理:

                         本质是通过一个名称为JSESSIONID的cookie来进行工作的。这个cookie会保存在浏览器中使用。

                  b. session的特点:

                         session是一门服务器的技术,将数据保存的服务器端。保存安全性要求较高的数据。且存储时间较短的数据。

                  c. 创建session对象

                  request.getSession();//如果服务器中有session对象,则取出使用,如果没有session对象则创建一个新的session对象使用。

                  request.getSession(true);//如果服务器中有session对象,则取出使用,如果没有session对象则创建一个新的session对象使用。

    request.getSession(false);//如果服务器中没有session对象,则返回null,如果有session对想则取出使用。(判断session是否存在时使用)

    1.1.2.  session是一个域对象

    生命周期:

    当程序第一次调用到request.getSession()代码时,服务器明确的直到了需要用到session了,此时创建session.

                         i. 意外身亡:在服务器意外关闭的情况下,session对象会被销毁。在服务器正常关闭的情况下,如果session对象未被释放,则其中的内容会序列化到磁盘上,这个过程,称之为钝化。当服务器再次启动的时候,会重新读取磁盘上这个文件,这个过程称之为活化。

                         ii. 自杀:主动session.invalidate()方法会立刻释放当前session对象。

                         iii超时死亡:在[tomcat]/conf/web.xml中有session默认的最大生命时长配置<session-config>标签,默认值为30分钟。超过30分钟,则当前session会被释放。

    作用范围:

    整个会话范围内可见

    主要作用:

    在会话范围内共享数据

    代码实现:

      i. SessionDemo1.java
    package cn.tedu.session;
                    
                    import java.io.IOException;
                    
                    import javax.servlet.ServletException;
                    import javax.servlet.http.HttpServlet;
                    import javax.servlet.http.HttpServletRequest;
                    import javax.servlet.http.HttpServletResponse;
                    import javax.servlet.http.HttpSession;
                    //session共享数据--作为域对象使用
                    public class SessionDemo1 extends HttpServlet {
                    
                            public void doGet(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    //1.获取session对象
                                    HttpSession session = request.getSession();
                                    //2.作为域对象使用--设置域属性
                                    session.setAttribute("name", "曹洋");
                            }
                    
                            public void doPost(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    doGet(request, response);
                    
                            }
                    
                    }

    SessionDemo2.java

                    package cn.tedu.session;
                    
                    import java.io.IOException;
                    
                    import javax.servlet.ServletException;
                    import javax.servlet.http.HttpServlet;
                    import javax.servlet.http.HttpServletRequest;
                    import javax.servlet.http.HttpServletResponse;
                    import javax.servlet.http.HttpSession;
                    
                    public class SessionDemo2 extends HttpServlet {
                    
                            public void doGet(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    //1.获取session对象
                                    HttpSession session = request.getSession(true);
                                    //2.获取域属性
                                    String name = (String) session.getAttribute("name");
                                    System.out.println("name:"+name);
                            }
                    
                            public void doPost(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    doGet(request, response);
                    
                            }
                    
                    }

    1.3设置服务器session 的时长

    1.在tomcat /conf/web.xml中设置session时长

         

     4. 案例:购物车

                  两个Servlet:buyServlet/PayServlet

                  一个jsp:sale.jsp  --- 挑选商品    点击商品名称加入购物车。点击付款按钮为商品结账。

    index.jsp页面  点击哪个标签,相当于购物车添加了一个商品

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%>
    <!DOCTYPE HTML >
    <html>
      <head>
       
      </head>
      
      <body>
        <a href="http://localhost/day12-cookiesession/servlet/BuyServlet?prod=鼠标">鼠标</a><br>
        <a href="http://localhost/day12-cookiesession/servlet/BuyServlet?prod=键盘">键盘</a><br>
        <a href="http://localhost/day12-cookiesession/servlet/BuyServlet?prod=月饼">月饼</a><br>
        <a href="http://localhost/day12-cookiesession/servlet/BuyServlet?prod=手机">手机</a><br>
        <a href="http://localhost/day12-cookiesession/servlet/BuyServlet?prod=拖鞋">拖鞋</a><br>
        <a href="http://localhost/day12-cookiesession/servlet/PayServlet">付款</a><br>
      </body>
    </html>

    BuyServlet

                    package cn.tedu.session;
                    
                    import java.io.IOException;
                    
                    import javax.servlet.ServletException;
                    import javax.servlet.http.Cookie;
                    import javax.servlet.http.HttpServlet;
                    import javax.servlet.http.HttpServletRequest;
                    import javax.servlet.http.HttpServletResponse;
                    import javax.servlet.http.HttpSession;
                    //购物车Servlet
                    public class BuyServlet extends HttpServlet {
                    
                            public void doGet(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    //1.请求乱码
                                    String prod = request.getParameter("prod");
                                    prod = new String(prod.getBytes("iso8859-1"),"utf-8");
                                    //2.响应乱码处理
                                    response.setContentType("text/html;charset=utf-8");
                                    
                                    //将商品放入购物车
                                    //1.获取session对象
                                    HttpSession session = request.getSession();
                                    //关闭浏览器前后都要操作同一个session
                                    //---在浏览器端保留一个名称为JSESSIONID的cookie,cookie值存储session的id ,这样关闭浏览器也可以再次获取到原来的session对象
                                    Cookie cookie = new Cookie("JSESSIONID",session.getId());
                                    cookie.setMaxAge(60*60*24);
                                    cookie.setPath(request.getContextPath()+"/");
                                    response.addCookie(cookie);
                                    
                                    //2.向session中添加域属性
                                    session.setAttribute("prod", prod);
                                    //3.在浏览器中提示,商品加入购物车
                                    response.getWriter().write("商品【"+prod+"】已经加入购物车");
                            }
                    
                            public void doPost(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {
                                    doGet(request, response);
                    
                            }
                    
                    }

    payservlet.java

    package cn.tedu.session;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    //支付Servlet
    public class PayServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            //从session中取出商品
            //1.响应乱码处理
            response.setContentType("text/html;charset=utf-8");
            //2.判断session是否存在--直接点击不会为任何商品付款
            if(request.getSession(false) != null){
                //3.如果存在,则取出域属性
                String prod = (String) request.getSession().getAttribute("prod");
                //释放session,清空购物车。
                request.getSession(false).invalidate();
                //页面提示已为商品付款
                response.getWriter().write("您以为商品【"+prod+"】付款¥10000");
            }else{
                //4.如果不存在则提示用户尚未选择商品
                response.getWriter().write("您尚未选择任何商品");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request, response);
    
        }
    
    }
  • 相关阅读:
    编码以及⼩知识点补充
    基本数据类型(dict)
    基本数据类型(list,tuple)
    python基础
    Eclipse使用技巧
    条件与(&&)和逻辑与(&)以及条件或(||)和逻辑或(|)区别
    到底怎么样才叫看书?——Tony Zhao's
    Jsp servlet 值传递。。
    (06)odoo报表
    (05)odoo数据库和业务操作
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11354714.html
Copyright © 2011-2022 走看看