• JavaEE——Http请求和响应,https的加密


    请求

    报头

    里面是一系列键值对,有的是标准定义的,有的是自定义的
    典型的有以下几个

    Host

    代表服务器的主机地址和端口
    也就是当我们访问浏览器时,可以知道从哪里获取数据
    端口号如果省略就代表是默认值,http是80,https是443

    URL中也有端口号和IP地址,而这两者并不一定一样
    当目标服务器有代理时,请求的URL的主机地址就是代理的地址,而Host中的地址是服务器的地址

    Content-Length

    表示body中的数据的长度
    由于我们Http早起是采用TCP传输的,因此具有粘包问题,所以需要给定报文长度

    Content-Type

    表示body中的数据格式
    不同的数据类型格式采用的解析方式是不一样的,因此需要指定
    常见有以下几种类型

    1. form表单提交的数据格式
    application/x-www-form-urlencoded: form
    
    • 1
    1. 表单提交的数据格式(提交文件时)
    multipart/form-data: form 
    
    • 1
    1. json数据
    application/json
    
    • 1

    User-Agent

    用来表示浏览器和操作系统的一系列属性
    例如一下几种

    1. 多少位系统
    2. win几的系统
    3. 浏览器的内核
    4. 浏览器的版本号
      由于早期互联网时代大家的设备差异比较大,因此不同的设备需要不同的页面显示方式,差一点的设备就少显示一点图,好一点的设备就多显示一点,不同的浏览器对页面的支持程度也是不一样的,因此通过传输这个属性给服务器,服务器就知道该给你返回什么样的页面了

    Referer

    代表当前页面是从哪一个页面跳转过来的
    如果当前页面是直接输入地址打开的,或者从收藏夹打开的,那就没有Referer
    通过Referer,可以核定一个浏览器为广告商带来了多少的引流

    Cookie

    由于为了防止某些恶意网站入侵我们的电脑,使得我们的磁盘中的文件遭到篡改与删除,因此浏览器的网页都是不能访问硬盘的

    因此,浏览器为网页提供了一系列api,让网页存储简单的数据,cookie就是其中的一种,是服务器发送给浏览器一些简单的数据,方便网页的跳转与再次打开

    cookie以键值对的形式存储数据

    比如可以传下面这几种数据

    1. 当前访问网页的用户信息
    2. 当前访问的位置
    3. 访问的次数和时间

    服务器的响应报文中,set-cookie的数据是设置cookie的数据,比如存储用户信息

    当浏览器再次访问这个网站时,网站会把之前存储的cookie传输给服务器,这样的话服务器就得到了身份信息,就不用再次登陆了

    例如,给大家抓个包,看一下前面提到的这几个概念

    GET /sw.js HTTP/1.1
    (这里就是主机地址和端口)
    Host: blog.csdn.net 
    Origin: https://blog.csdn.net
    Accept-Encoding: gzip, deflate, br
    (这里是cookie)
    Cookie: c_dsid=11_1668321926105.806691; dc_session_id=10_1668321931278.555733; log_Id_click=794; log_Id_view=1736; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1668322413; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1668075076,1668215971,1668304024,1668321927; c_page_id=default; c_pref=https%3A//blog.csdn.net/; c_ref=https%3A//mp.csdn.net/; c_segment=2; dc_tos=rl9xt8; log_Id_pv=676; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_19406376060-1636882844312-793122!5744*1*m0_60867520; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22m0_60867520%22%2C%22scope%22%3A1%7D%7D; __bid_n=183e5bc0225476c4084207; c_first_page=https%3A//blog.csdn.net/m0_60867520%3Fspm%3D1000.2115.3001.5343; c_first_ref=default; dc_sid=a39818fac3c56bf45e17bae53186475e; HWWAFSESID=1bd914e48a3f275855f; HWWAFSESTIME=1668321923442; FCNEC=%5B%5B%22AKsRol_XiY2H06P5Xlw3z7LQfwhl4kqvq5sIj4R2iX7vxEhCs08i5Qfm5nQ9hXeBbbv5FhhSbIwcDxwqNW-JDnQzByjf98hzA6ShijaMOwYSkJbQeQTeoHl1KMfL3s1v6Xg97Mlx6w-MMW0TDYDGmfwWd9298lo5DQ%3D%3D%22%5D%2Cnull%2C%5B%5D%5D; __gpi=UID=000009711177805a:T=1662280592:RT=1668304025:S=ALNI_MadB__bBPsEbHe_0fVn_E4rh8bltA; is_advert=1; firstDie=1; ssxmod_itna=eqRxRDBDcD9AKGKGH0hC07GkQD7GeiQq8eHYImDlxQwPGzDAxn40iDto=qhnornhiY=fKnOG+diGnrP0Iq7PrP5PfbnRedoD84i7DKqibDCqD1D3qDkbiYxiiDGdU8nDDx0rDG4iafmTy1pxKDUY2WrYhNk=idKeRqZAibK0GY=GWbqDrpeGG5GCh+w9hzKOhNKYD===; ssxmod_itna2=eqRxRDBDcD9AKGKGH0hC07GkQD7GeiQq8eHYeD6p4QqmxDskjDLQQeOum0Dqn+48Ye/wh68e/=GKe88/O0o6m/+fh758rrDpD=sjiepaKYNxTddHs=uzUF9x1/PnyRyE6=5BypZi5yDVWw1nAirZrmNHpPaylcFVQWhLPm8VCaa3tgbL=Ww7IB80EAp3bS86E7WGfgpUfBb63dFg6K6CpcLnIWFPbiXgZmUTxq6yDwXd1YUKkkRNXeexhrY3ZPeY7eKmD1h3AhGrEOb=h9TeFuDiDwgxPT1Kpnw9cE2c6/rKugaZmw1zE5GBdj0dCoQifoCO8omYOqbxhd3GiKY3orx3uYN2DcEopwiHgGTbhKwaertrwrc3dCQowLKjwizeKO8YN2CRqKwLoAMdkTidrT/MdWdKx6K5RHF2O83H+Rkdo7HbOc+bi67WcE=pEFmLt2k1ZpeOvwpApP=CoArbjCOC1a64oPD7jgDGcDG7uODNDx8TDD==; __gads=ID=4ea7d0a4ecd37ee1-2235438dd8d70085:T=1667202525:RT=1667202525:S=ALNI_MaMuEad1hYwTDZx_QZCGwFd0sQKhw; FPTOKEN=30$MopefTes+oZpPK6toPAhBx51Jkf9qoNou5sQ5nIqneIX4PhBtpAsxtEBc76AQs9WOaJjwxItblyB8EW/sLxs5T0I/kL/KjtpLbx6pk/ojEIhGiQzqoGscV8k9FHd4HmCpud/RXGieejdSIq95AICEhi1Erl95ummz/XBzvkWzFjSgo+/txL4p5ETCor0ixhOlDaIgbhfR2JBIHMSmhtQ+JbbP1LrdVB2+wxtLITOnssE02CuNBj0Gy/E/xsjoXQnuC/mIVOTaUEIRRaDkxOR6fOy/n50FWt84MYUuC26etIhLyJ9pVxZP3ss6H/fXqEzgrfgv4AiRzMR+wcHhU5cSCLlOdSislMsyQqKnLonQyEGR683E6xMtOl8CgDMZi+yTzZr6n5vMwHih5kMA2ZualamIb1KhHtyCrz/OzfeDMc=|2t9hFLuiMkraJiWOrBtyMNOEfpEtZpoKTRFhp0enI3o=|10|54642beb2d74356187b795abbc93d44c; c_dl_fpage=/download/u012513463/77747331; c_dl_fref=https://blog.csdn.net/qq_24950043/article/details/125714225; c_dl_prid=1665566040391_574973; c_dl_rid=1666093978240_243831; c_dl_um=-; AU=E5A; BT=1660286910129; UN=m0_60867520; UserInfo=1dd1ec314c054470a954e82931020212; UserName=m0_60867520; UserNick=Xiaolock830; UserToken=1dd1ec314c054470a954e82931020212; p_uid=U010000; uuid_tt_dd=10_19406376060-1636882844312-793122
    Connection: keep-alive
    Accept: */*
    (这里是浏览器和操作系统的信息)
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
    Accept-Language: zh-CN,zh-Hans;q=0.9
    (这里是浏览器跳转前的地址)
    Referer: 
    Service-Worker: script
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    构造http请求

    有以下几种不同的构造方法

    1. 浏览起自己通过url构造请求
    2. form表单
    3. ajax

    form表单

    只支持get和post方法
    其中的action表示要访问的网页
    input中的name是键
    input中的用户输入的值是值,和name构成键值对
    如果是get请求,就将键值对放到url中,如果是post就放在body中

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    <body>
        <form action="http://www.sogou.com" method="get">
            <input type="text" name="aaa">
            <input type="text" name="bbb">
            <input type="submit" value="提交">
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    最终的url长这样
    在这里插入图片描述
    如果是post方法,那我们只能用抓包工具来看body中的内容了

    ajax

    全称是Asynchronous Javascript And XML
    其中的Asynchronous代表异步的

    在之前的多线程中讲的同步(synchronized)表示的是互斥
    而在网络通信中,同步代表发起请求者同时也接受响应,异步代表发起请求者不接受响应,由其他的人来推送过来

    form的请求一定会触发页面的跳转
    ajax的请求默认不会引发页面跳转

    由于浏览器的原声ajax的api不好用,因此我们可以引入jquery,这个第三方库封装好的api更好用
    jquery直接上网搜索即可,选择.min.js,复制其script标签
    在这里插入图片描述

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js">script>
    <script>
         $.ajax({
             type: 'post',
             url: 'http://sogou.com',
             data: 'http请求的body',
             contentType: 'x-www-form-urlencoded',
             success: function(body){
                 //浏览器返回正常响应时调用这个函数,body为响应正文
                 console.log('ok');
             },
             error: function(){
                 //浏览器返回错误响应时调用这个函数
                 console.log('error');
             }
         });
     script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用这种方法在浏览器中会看到报错,这是因为默认情况下域名a是无法访问域名b的资源的,也就是说搜狗拒绝了我们的访问。如果我们的项目是在同一个服务器下相互访问的就不会报错

    这种情况下,我们可以用postman来进行测试,这是一个专门用来构造请求的工具,方便了我们的测试

    响应

    状态码

    我们上网常常看到的404网页就是一个状态码,表示了请求的状态,可以告诉我们请求是否成功,为什么失败
    最常见的状态码有以下几种

    类型

    号码开头类型原因.
    1xx信息性状态码接收的请求正在处理
    2xx成功状态码请求正常处理完毕
    3xx重定向状态码需要附加操作以完成请求
    4xx客户端错误状态码服务器无法处理请求
    5xx服务器错误状态码服务器处理请求出错

    具体实例

    200

    表示访问成功
    大家抓包时看到的最多的响应的状态码都是200

    404

    not found
    产生错误的原因就是请求的路径错了
    访问的资源服务器上没有了,就会返回404

    403

    表示访问访问被拒绝
    也就是我们的访问权限不够,只有管理员或者特定的用户才能访问这个网站

    500

    表示服务器内部错误
    也就是服务器里有bug,比如说空指针异常了,我们很少见到,除非是自己写的代码

    504

    表示访问超时
    如果服务器的访问流量过大,就会出现访问超时的情况

    302

    表示重定向
    如果以前的网站的域名不用了,换成了新的域名,就需要重定向,还有我们的网页跳转也是重定向

    418

    是一个彩蛋,418I’m a teapot
    在许多年前,电脑上安装一个软件,很有可能安装下来的根本就不是你想要的那个软件
    这是因为,运营商劫持了我们网上传输的数据,替代了新的数据给我们
    为了防止这种事情发生,也为了防止黑客对我们数据的入侵,因此发明了更为安全的传输协议——HTTPS

    加密

    加密是指用密钥把明文变成密文
    与之对应的,解密就是把密文变成明文

    对称加密

    而当一个服务器想要让客户端把传输过来的用户信息进行加密时,双方都要知道这个密钥是什么,这就是对称加密。但显然,你这个密钥被更多人知道,你的信息被破获的概率就更大,因此一个服务器给不同的客户端不同的密钥
    但这样的话,服务器就需要同时掌握多个密钥,一一进行匹配,大量的浪费了资源

    不对称加密

    因此,根据数学上的一系列规律,发明了不对称加密,客户端的密钥是不同的,而服务器只用一个密钥就可以把所有的密文破解为明文,客户端拿到的是公钥,这个公钥告诉谁都可以,而服务器拿到的是私钥,这个私钥只能自己持有

    但是,如果黑客先冒充客户端,向服务器获取了公钥,再冒充服务器,向客户端提供了自己篡改后的公钥。这时,客户端传输过来的数据就是按照黑客的钥匙加密的数据了,黑客就可以看了。而且还可以用之前获取的公钥对明文重新加密成正确的格式,发送给服务器,使服务器与客户端之间正常的工作

    证书

    证书是为了保证公钥是服务器提供的而不是黑客提供的
    第三方公证机构会给各个服务器的资质进行审查,然后颁发证书
    客户端在向服务器获取公钥前,会先对服务器获取证书,然后看这个证书是否合法,然后才会进行传输数据
    因此,如果是没有证书的网站,浏览器会警告我们这个网站很危险,也有时候会告诉我们这个网站的证书过期了

  • 相关阅读:
    JavaScript-方法的定义和调用、apply、内部对象
    LSTM 与 GRU
    rabbitMQ学习笔记
    音视频技术开发周刊 | 315
    浅谈基于QT的截图工具的设计与实现
    Node.js版本管理工具nvm安装
    2024中国网络安全产品用户调查报告(发布版)
    C语言青蛙爬井(ZZULIOJ1072:青蛙爬井)
    深度学习模型不确定性方法对比
    Windows Server 2016 部署DNS
  • 原文地址:https://blog.csdn.net/m0_60867520/article/details/127832212