• Java网络开发(Session)—— 从http请求 到 cookie 到 session & 用 session控制 删改数据的权限


    引出

    http请求的特点,无状态,如何保存登陆信息?
    cookie是啥,和local Storage的区别,cookie有啥用?
    session是啥,session能干啥?

    在这里插入图片描述


    1.http请求的特点—无状态

    http请求是无状态的,指的是:http协议协议对于事务处理没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。如果用户发来一个新的请求,服务器也无法知道它是否与上次的请求有联系。

    解决HTTP无状态的方法:

    采用会话跟踪技术来解决这个问题。把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在服务器上的状态信息了。

    会话跟踪的方法:cookie 和 session

    2.cookie是啥?能干啥?VS local Storage

    (1)初识cookie VS local Storage

    如下图所示是cookie

    (1)cookie,HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据;

    (2)浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上;

    (3)不同浏览器访问同一个服务器,cookie空间是独立的;同一个浏览器访问不同的服务器,cookie空间也是独立的;

    (4)cookie可以告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态;

    (5)Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能;

    (6)cookie的本质是一个键值对

    local Storage也是一个存储空间,和cookie的区别:

    cookie每次访问服务器的时候,会发给服务器,local Storage里的东西保存在本地,在请求服务器的时候,不会发给服务器;

    (2)用tomcat的servlet理解cookie

    CookieDemoServlet.java代码如下:

    package com.tianju.servlet.cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * cookie生成在服务器,发给浏览器,保存在浏览器;
     * 每个网站,都有自己独立的cookie空间
     */
    @WebServlet("/setCookieDemo")
    public class CookieDemoServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // new cookie对象
            Cookie cookie = new Cookie("name", "peter");
            Cookie cookie1 = new Cookie("age", "19");
            cookie.setMaxAge(100);
            // 把对象添加到响应中;
            resp.addCookie(cookie);
            resp.addCookie(cookie1);
            resp.getWriter().write("add success");
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    如下图所示,访问该服务的时候,由tomcat服务器进行处理,设置了cookie,然后作为响应发给浏览器,浏览器拿到cookie时把cookie存到了浏览器本地的cookie存储空间中;

    在这里插入图片描述

    在这里插入图片描述

    cookie本质是键值对,主要参数如下:

    • Name:这个是cookie的名字

    • Value:这个是cooke的值

    • Path:这个定义了Web站点上可以访问该Cookie的目录

    • Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
      在这里插入图片描述

    • Size:这个表示cookie的大小

    cookie没有清除的方法,可以把时间设置成0,一生成就消失,似乎没啥用
    在这里插入图片描述

    (3)cookie能干啥?

    cookie的首次访问和再次访问:

    (1)首次访问,请求中没有cookie,服务器生成cookie,传给浏览器;

    (2)第二次访问,请求中有cookie,把cookie以及其他发给服务器;

    cookie的问题:

    不安全:可以任意添加;可以被修改;

    但是cookie可以从浏览器给服务器发送数据,既然可以发送数据,那就可以用这个数据做一些事情。

    3.session是啥?

    (1)从cookie到session

    • 1.生成一个cookie ,name:JSESSIONID 值:6AC5747CDCF5C2E9788F0412AA904157
    • 2.服务器上以值:6AC5747CDCF5C2E9788F0412AA904157:,指向服务器上的一块空间;
    • 3.在这块存储空间中,可以使用session.setAttribute存储资源;
    • 4.使用session.getAttribute() 获取资源
    • 5.把这个Session发给前端

    在这里插入图片描述

    在Servlet中,在session空间中设置一个键值对

    String username = req.getParameter("username");
    // 获取session
    HttpSession session = req.getSession();
    // 设置一个键值对
    session.setAttribute("username", username);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后通过下面方式,拿到该键值对:

    HttpSession session = req.getSession();
    Object name = session.getAttribute("username");
    System.out.println(name);
    
    • 1
    • 2
    • 3

    (2)设置session有效时间

    在web.xml文件中配置

    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
    
        <session-config>
            <session-timeout>30session-timeout>
        session-config>
        
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (3)应用:用session记录登录成功的User对象

    用下面方式,就可以在登陆成功后,在服务器的session空间中存储登陆成功的对象;

    此时,当浏览器再次访问服务器时,浏览器带着cookie里的JSESSIONID发送到服务器;

    服务器再根据JSESSIONID定位到服务器的session空间;

    然后用,session.getAttribute(“username”);就可以获得之前保存在session中的数据;

    // 3.用输入的用户名去数据库中查询一条记录
    User userDb = userService.queryByUsername(username);
    
    // +登陆成功的用户存到session----用于确定当前的操作是谁做的
    req.getSession().setAttribute("user", userDb);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.用session控制数据 删改权限

    其实就是在删除 或 修改的时候看一下要修改的书的作者的id是否等于当前session中保存的user对象的id是否一致,如果不一致,就不能操作;

    		// 获取要删除的id
            String id = req.getParameter("id");
    		HttpSession session = req.getSession();
            User user = (User) session.getAttribute("user");
            // 根据id查一条图书信息出来
            Opus find = opusService.queryById(Integer.parseInt(id));
            if (!find.getAuthorId().equals(user.getId())){
                // 如果修改的 人的id 修改的 不是自己 名下的 就不能修改
                System.out.println("没有权限");
                return;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    总结

    1.http请求是无状态的,因此出现了cookie;
    2.cookie不安全,里面的值可以被随便改;
    3.用cookie里的JESSIONID值对应服务的session存储空间;
    4.在服务器的这个空间里保存信息,记录登陆成功的user;
    5.在删改时,每次浏览器请求,cookie也会发给服务器,服务器用cookie里的JESSIONID找到对应的session区域,然后再找到这个session中的用户信息,就能控制删改权限;

  • 相关阅读:
    Tomcat使用与Servlet
    银河麒麟服务器系统使用的一些问题和解决方案
    NoSuchBeanDefinitionException
    EasyClick java插件项目和混合工程未找到编译后的目录
    【数智化人物展】白鲸开源CEO郭炜:大模型助力企业大数据治理“数智化”升级...
    OSG文字-显示汉字 (1)
    轻量级的日志采集组件 Filebeat 讲解与实战操作
    语言大模型推理加速指南
    16. Thymeleaf教程(10分钟入门)
    Java常量:Java常量的定义和分类
  • 原文地址:https://blog.csdn.net/Pireley/article/details/131142921