首页 > 编程语言 >javaweb3

javaweb3

时间:2022-11-29 16:37:22浏览次数:46  
标签:jakarta session cookie key import servlet javaweb3

5.Cookie

5.1介绍

  • Cookie是在web浏览器访问web服务器上的某个资源时,由web服务器在响应浏览器通过响应头附带的传送给浏览器并存储在 浏览器端的一小段数据

5.2使用

  1. 创建两个类,一个类写Cookie,一个类读Cookie

    • 都继承HttpServlet类和配置xml信息
  2. 写cookie

    • package CookieServlet;
      
      import jakarta.servlet.ServletException;
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.Cookie;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.io.PrintWriter;
      
      @WebServlet("/wrist")
      public class wrist extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //创建cookie(可以同时创建多个cookie)
              Cookie cookie = new Cookie("key","value");
              //设置cookie的生命周期(秒)
              //参数等于0时,关闭浏览器即销毁cookie
              cookie.setMaxAge(24*60*60);
              //响应信息
              resp.setStatus(200);
              resp.setContentType("text/html;charset=utf-8");
              resp.setCharacterEncoding("utf-8");
              PrintWriter out = resp.getWriter();
              //返回什么数据
              out.println("<!DOCTYPE html");
              out.println("<html>");
              out.println("<head><meta charset= utf-8>");
              out.println("<title>Cookie使用</title>");
              out.println("</head");
              out.println("<body>");
              out.println("<a href='read'>访问cookie</a>");
              out.println("</body>");
              out.println("</html>");
              //关闭和刷新out
              out.flush();
              out.close();
          }
      }
      
      
  3. 读cookie

    • package CookieServlet;
      
      import jakarta.servlet.ServletException;
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.Cookie;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      
      import java.io.IOException;
      
      @WebServlet("/read")
      public class read extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //读取cookie(cookie能有多个,所以用数组)
              Cookie[] cookies = req.getCookies();
              //遍历数组
              for(Cookie cookie: cookies){
                  if("key".equals(cookie.getName())){
                      String value = cookie.getValue();
                      System.out.println("key的值为:"+value);
                  }
              }
          }
      }
      
      

5.3优缺点

  1. 优点
    1. 可以灵活的配置过期规则
    2. 简洁:cookie中存储的是最简单的键值对格式的文本数据
    3. 数据的持久性,保存到浏览器中的cookie在过期之前是持久存储的
  2. 缺点
    1. 存储数据的大小,大多浏览器支持4k 8k的数据存储
    2. 用户可以通过浏览器设置禁用Cookie,因此限制了cookie的使用场景(如果-定要使用cookie, 可以检查浏览器cookie是否可用,如果不可用提醒用户设置开启cookie)
    3. cookie是存储在客户端浏览器中的,有被纂改的风险,有潜在的安全隐患

6.Session

6.1原理

  1. 当客户端浏览器(第1次)请求服务器时, 服务器会为当前客户端连接创建一个Session对象, 同时将sessionID通过Cookie响应给客户端,并存储在客户端;
  2. 当客户端端再次请求服务器的时候,会通过请求头携带存储sessionID的cookie, 服务器接收请求之后获取cookie中的sessionID,通过这个sessionID获取第一 次连接时创建Session对象。

6.2使用

  1. 创建两个类,一个类写Session,一个类读Session

    • 都继承HttpServlet类和配置xml信息
  2. 写Session

    • package SessionServlet;
      
      import jakarta.servlet.ServletException;
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      import jakarta.servlet.http.HttpSession;
      
      import java.io.IOException;
      
      @WebServlet("/SessionWrist")
      public class SessionWrist extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //创建Session,getSession()--获取当前用户连接
              HttpSession session = req.getSession();
              //getId();---获取sessionID
              String sessionId = session.getId();
              //将数据保存到session对象
              session.setAttribute("key","Hello Session");
          }
      }
      
      
  3. 读Session

    • package SessionServlet;
      
      import jakarta.servlet.ServletException;
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      import jakarta.servlet.http.HttpSession;
      
      import java.io.IOException;
      
      @WebServlet("/SessionRead")
      public class SessionRead extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //创建Session,getSession()--获取当前用户连接
              HttpSession session = req.getSession();
              //从session对象中取数据
              String string = (String)session.getAttribute("key");
              System.out.println("SessionRead:"+string);
      
          }
      }
      
      

6.3Session数据操作

  • //创建session对象
    HttpSession session = req.getSession();
    //将数据保存到session对象
    session.setAttribute("key","Hello Session");
    //从session对象获取数据(对应key值)
    session.getAttribute("key");
    //修改session对象数据(对应的key值,修改后的值)
    session.setAttribute("key","HttpSession");
    //删除session对象数据(对应的key值)
    session.removeAttribute("key");
    //设置session对象最大存活时间(秒),超过这个时间session对象自动就会销毁
    session.setMaxInactiveInterval(60);
    //手动销毁session对象
    session.Invalidate();
    

6.4Session对象失效

  1. 后果
    1. 一个客户端的多次请求正常情况下获取到的是同一个session对象,也是正式因为多次请求获取的是同一个session对象才实现了session中存储的用户状态可以作用于请求。
    2. 如果session失效,将会导致session失效的后的请求无法获取之前的session对象,也就是说多次请求获取的不是同一个session。
  2. 产生
    1. 客户端禁用Cookie, 或者客户端在两次请求之间清除了cookie,将导致下一-次请求无法获取上-一次请求创建的Cookie;
    2. session是有生命周期的,当客户端请求服务器建立连接之后,服务器会为此会话创建session对象,如果客户端的两次请求时间间隔>session过期时间(默认30min),服务 器会将之前创建的ession对象销毁;
  3. 解决
    1. 如果客户端禁用了Cookie:不能通过cookie来记录、传递sessionld, 我们可以通过重写URL, 使用url传递sessionID (在url 上追加sessionld)
    2. 如果session过期:我们可以根据系统的需求灵活设置session的生命周期或者手动销毁session对象

6.5request与session区别

  • request对象用于获取用户的请求数据,作用于浏览器和服务器的一次请求
  • session对象用于记录当前用户的状态,作用于一个客户端的多次请求
  • 浏览器请求ServletA. ServletA转发到ServletC
    • ServletC与ServletA同属于一次请求, 共享同一个request对象, 都可以通过request获取浏览器提交的数据
  • 浏览器请求ServletB, ServletB重定向到SenvletD
    • 重定向到ServletD,ServletB 与ServletD是浏览器的两次请求,ServletD中的request与ServletB是不同的对象

6.6ServletConText

6.6.1介绍

  1. HttpServletRequest对象作用于一次用户请求,获取用户数据

  2. HttpSession对象作用于一个用户的多次请求,实现数据共享

  3. ServletContext对象作用于整个javaweb项目,实现多个用户之间的数据共享

    image-20221129155911728

    ServletContext是Javaweb项目的全局对象,包含当前web项目在web服务器中的信息,同时他也是个域对象,可以实现访问当前web项目的所有用户之间的数据共享

6.6.2使用

  • //获取ServletContext对象
    ServletContext servletContext = getServletContext();
    //获取当前web应用的访问路径
    String contText = servletContext.getContextPath();
    //request对象获取访问路径
    String contextPath = req.getContextPath();
    //获取web项目中的目录(绝对路径),参数为文件名
    String realPath = servletContext.getRealPath("/CookieServlet");
    //将数据存储到全局对象
    servlet.serAttribute("key","value");
    //根据key从全局对象取数据
    servlet.getAttribute("key");
    //从全局对象移出数据
    servletContext.removeAttribute("key");
    //获取web.xml配置中的全局参数
    ServletContext.getInitParameterNames();
    //根据key获取value
    servletContext.getInitParameter("key");
    
  • <!--配置context信息-->
    <web-app>
        <context-param>
            <param-name>key</param-name>
            <param-value>value</param-value>
        </context-param>
    </web-app>
    

6.7ServletConfig

  • ServletConfig对象表示的一个Servlet在web服务器的配置信息

  • //获取当前servlet类的ServletConfig对象
    ServletCpnfig servletConfig = getServletConfig();
    //通过ServletConfig获取当前Servlet类路径
    servletConfig.getServletName();
    //通过ServletConfig对象加载当前servlet类的初始化参数
    //获取当前servlet所有初始化参数的key
    getInitParameterNames();
    //根据key获取value
    getInitParameter("key");
    

标签:jakarta,session,cookie,key,import,servlet,javaweb3
From: https://www.cnblogs.com/Myvlog/p/16935745.html

相关文章