会话层技术-session

会话层技术-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);//来吧,展示!
    }
}

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

posted @ 2024-10-20 21:25  yzh先生  阅读(352)  评论(0编辑  收藏  举报