ETJava Beta | Java    注册   登录
  • 搜索:
  • 会话层技术-session

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/yzhShowTime/p/18487922
    如有侵权 请联系我们删除  (页面底部联系我们)  

    会话层技术-session
    session技术拿下!

    一、先整理学习过程中的几个疑惑

    1. cookie和session分别都是怎么创建的?

      • 首先cookie是一个类,它需要java后端开发人员手动创建。
        Cookie cookies1 = new Cookie(keya, valuea);
      • 其次session是HttpSession接口的接口对象,它是由服务器来创建的,注意这里的创建不是指的是你在浏览器访问网址的同时,他就创建了,而是在servlet重写的service或doXXX方法中通过HttpSession session
        = request.getSession();或者HttpSession session = request.getSession(true);这两种方式任一个创建的。
      • 注意:在默认访问jsp文件时,在你打开网站的同时就创建了Session对象,这是因为jsp中默认设置为true,<%@ page session = "true"%>,当jsp文件编译生成.java代码后,里面会有一句session = pageContext.getSession();所以,在tomcat启动后默认访问jsp页面时,这条代码就帮你创建session了,本质上,还是要通过获取session对象的时候判断有没有才会自动创建或者选择之前的session对象。
    2. 借助这个问题解决response.getWriter()获取的对象是由是创建的?

      • response.getWriter()获取的是PrintWriter类型的对象,当使用这条代码时候,服务器(就是servlet容器)自动创建该类型的对象来向网页上打印字符串。
      • 可能又会有疑惑了,为什么不直接new 一下创建这个对象啊!这个我通过搜索整理,简单理解为:response.getWriter()输出的是流对象(所谓的流对象,就是打印结果可以输出在页面上),如果new PrintWriter()一个对象,再输出就不会输出到网页上,而是idea的打印台了,这仅仅是我自己的个人理解,便于我记忆!大家有好的可以给我分享,学习永无止境,哈哈!

    二、ServletC用来实现session技术的处理过程

    先简单那介绍下session技术的处理流程:

    1. 用户首次访问服务器,服务器没有Session,自动创建session对象和ID(这个ID相当于一个特殊的cookie,用于保存每一个Session对象独有的id值,他特殊就特殊在name = JSESSIONID, value = 这个id的值,普通的cookie的名字可以随意起,值可以随意更改,而由服务器创建的这个Session对象的ID名字是固定的,值也是唯一的。
    2. 服务器把这个特殊的cookie响应给客户端,等到下次用户访问的时候,Servlet可以获取到每个用户独有的JSESSIONID值,从而对数据进行存储记录。

    三、ServletC代码具体要怎么实现呢

    1. 首先我要通过request对象调用getParameter()方法来获得访问服务器的用户信息。
    2. 紧接着,我调用request对象的getSession()方法来判断(是通过JSESSIONID的值来判断的)是否该用户是之前已经创建过的session,若是则不再重新创建,直接获取,若否,则自动重新创建并获取。
    3. 之后,我把获取到的用户信息存入Session对象中(相当于个人档案)。
    4. 最后,通过response对象向客户端响应JSESSIONID的值(特殊的cookie)。

    具体代码实现如下:

    package com.atguigu.servlet;
    
    import com.sun.deploy.net.cookie.CookieUnavailableException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet(name = "ServletC", urlPatterns = "/ServletC")
    public class ServletC extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
            //接收请求中的用户参数的值,接收姓名
            String username1 = req.getParameter("username");//调用req对象的getParameter方法获得usrname参数的值
            //该方法传入参数名,获得参数值
    
            //创建Session对象
            HttpSession session1 = req.getSession();//具体含义上述已说
    
            //把用户信息存入Session对象中
            session1.setAttribute("username", "yzh");
            //查看该Session对象的JSESSION值
            String id01 = session1.getId();
            System.out.println("JSESSIONID = " + id01);
            //响应用户信息
            resp.getWriter().println("已响应");
        }
    }
    
    

    四、ServletB来获取已经创建的session对象存储的用户信息

    我已经通过ServletC将用户信息存入创建的Session,那怎么来通过下次的访问,根据特殊的cookie来识别用户,并把用户信息提取打印出来呢?ServletB给我们答案(小嘲:有点小风范啊!哈哈)

    package com.atguigu.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/ServletD")
    public class ServletD extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session2 = req.getSession();//再次判断session是否已经存在,已经存在,直接瞄准他
            System.out.println("上个session的id值是:" + session2.getId());
            String username2 = (String)session2.getAttribute("username1");//调用getAttribute()方法得到该用户的属性值
            resp.getWriter().println(username2);//来吧,展示!
        }
    }
    
    

    让我们每天进步一点点,稳才是长远之道!