NodeJs之同源限制问题

news2024/11/26 9:32:00

1. 说明

app1是基于3001端口的服务器, app2是基于3002端口的服务器。
在这里插入图片描述


gitee地址:https://gitee.com/studyCodingEx/studys/

在这里插入图片描述

2. app1

2.0 app1.js

const express = require('express');
const path = require('path');
// 向其他服务器端请求数据的模块
const request = require('request');

const app = express();


app.use(express.static(path.join(__dirname, 'public')));


app.get('/server', (req, res) => {
	console.log(req.session);
	request('http://localhost:3002/serverIndex', (err, response, body) => {
		res.send(body); 
	});
	/*
		此时向端口为3002的服务器发起get请求, 那么3002端口的服务器的结果最终会被传递到回调函数的body参数中; 
		最后再将body结果响应给客户端; 
		好比说: 客户端要访问3002端口(非同源)服务器的数据, 首先给自己的3001端口的服务器发起get请求, 
				然后再由3001端口的服务器 向 3002端口的服务器发起请求(服务器与服务器之间不存在同源限制的问题),
				最后3002端口的服务器的响应到达3001端口的服务器, 
				最后由3001端口的服务器将数据响应给客户端; 
	*/ 
});


app.listen(3001, () => {
    console.log('server1 is listening on 3001......');
});

2.1 Ajax请求限制

<!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>Document</title>
</head>
<body>
    <!-- 
        Ajax请求限制:
            Ajax只能向自己的服务器发送请求。
            比如现在有一个A网站、有一个B网站,A网站中的HTML文件只能向A网站服务器中发送Ajax请求,
            B网站中的HTML文件只能向B网站中发送Ajax请求,但是A网站是不能向B网站发送Ajax请求的,
            同理,B网站也不能向A网站发送Ajax请求。

        同源:
            如果两个页面拥有相同的协议、域名和端口, 那么这两个页面就属于同一个源, 其中只要有一个不相同, 就是不同源!

        同源政策:
            同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据。
            最初的同源政策是指A网站在客户端设置的Cookie,B网站是不能访问的。
            随着互联网的发展,同源政策也越来越严格,在不同源的情况下,
            其中有一项规定就是无法向非同源地址发送Ajax请求,如果请求,浏览器就会报错。
     -->
</body>
</html>

2.2 00_测试非同源Ajax请求

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h2>这是服务器s1-public文件夹下的index.html文件</h2>
    <script src="./js/ajax.js"></script>
    <script type="text/javascript">


    /*
        向非同源的服务器发起 Ajax请求,  打开终端, 可以看到以下报错;
    */
    /* 
        Access to XMLHttpRequest at 'http://localhost:3002/test?' from origin 'http://localhost:3001' has been blocked by CORS policy: 
		    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    */

        AJAX({
            url: 'http://localhost:3002/test',
            type: 'get',
            success: function(result) {
                console.log(result);
            }
        }); 
    </script>
</body>
</html>

请添加图片描述

2.3 01_使用JSONP解决跨域1.html

<!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>Document</title>
    <!-- 
        JSONP请求属于get请求; 
     -->
    <!-- 
        使用JSONP解决同源限制:
            JSONP不属于Ajax请求, 但是它可以模拟Ajax请求; 
            使用步骤如下:
            1. 将不同源的服务器端请求地址写在script标签的src属性中; 
            2. 服务器端响应数据必须是一个函数调用(就是客户端定义的函数,这里是fn(...)), 要发送给客户端的数据需要作为函数调用的参数即可;
                    res.send( fn({name: "ZhangSan"}) );
               首先在客户端全局作用域下定义函数fn(), 在fn()函数内部对服务器端返回的数据进行处理; 
                    function fn(data) { console.log(data); }
     -->
</head>

<body>
    <script src="./js/ajax.js"></script>

    <script>
        function fn(data) {
            console.log(data);
        }
    </script>
    
    <script src="http://localhost:3002/test"></script>      
    <!-- 相当于向服务器2的地址http://localhost:3002/test发起get请求 -->
    <!-- 而后服务器2 	res.send('fn({name: "ZhangSan"})');  -->
    <!-- 也即相当于返回fn( {name: 'ZhangSan'} ), 这不就是函数调用吗! -->
</body>
</html>

请添加图片描述

2.4 02_使用JSONP解决跨域2.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>

<body>
    <!-- 
        优化:客户端将函数名字通过请求参数传递到服务器; (解决了服务器端返回的函数名字必须和客户端函数名字保持一致的情况)
     -->
	<button id="btn">点我发送请求</button>
	<script>
		function fn (data) {
			console.log(data);
		}
	</script>
	<script type="text/javascript">
		// 获取按钮
		var btn = document.getElementById('btn');
		// 为按钮添加点击事件
		btn.onclick = function () {
			// 创建script标签
			var _script = document.createElement('script');
			// 设置src属性
			_script.src = 'http://localhost:3002/better?callback=fn';
			// 将script标签追加到页面中
			document.body.appendChild(_script);
			// 为script标签添加onload事件
			_script.onload = function () {
				// 将body中的script标签删除掉
				document.body.removeChild(_script);
			}
		}
	</script>
</body>
</html>

请添加图片描述

2.5 03_封装JSONP函数.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>

<body>
	<button id="btn1">点我发送请求(btn1)</button>
	<button id="btn2">点我发送请求(btn2)</button>
	<script type="text/javascript">
		var btn1 = document.getElementById('btn1');
		var btn2 = document.getElementById('btn2');

		btn1.onclick = function () {
            JSONP({
                url: 'http://localhost:3002/better',
                data: {                                 /* 请求参数 */
                    name: 'good',
                    age: 30
                }, 
                success: function(data) {
                    console.log(123);
                    console.log(data);
                }
            }); 
		}

        btn2.onclick = function () {
            JSONP({
                url: 'http://localhost:3002/better',
                success: function(data) {
                    console.log(456);
                    console.log(data);
                }
            }); 
		}

        function JSONP(options) {
            var params = '';
            for(let attr in options.data) {
                params += '&' + attr + '=' + options.data[attr]; 
            }   // &name=Zhang&age=30
            console.log(options.data);
            // 动态创建script标签
            let _script = document.createElement('script');
            let randomFunName = 'myJSONP' + Math.random().toString().replace('.', ''); // myJSONP0231421
            // 挂载到window下, 使其成为全局函数
            window[randomFunName] =  options.success;                                   
            // 为script标签添加src属性
            _script.src = options.url + '?callback=' + randomFunName + params;
            document.body.appendChild(_script);
            _script.onload = function () {
				document.body.removeChild(_script);
			}

            /*
                // 此种情况下将会出现window.fn函数覆盖问题; 
                // 解决方案:见上(随机函数名字); 
                // 配合app2中的 setTimeout(() => { res.send(result); }, 1000); 来进行演示此种现象的发生;
                // 在1秒内进行2次Ajax请求, 然后在客户端查看结果; 发现确实覆盖了...; 

                var _script = document.createElement('script');
                window.fn =  options.success;            
                _script.src = options.url + '?callback=fn';
                document.body.appendChild(_script);
                _script.onload = function () {
                    document.body.removeChild(_script);
                }
            */
        }
	</script>
</body>
</html>

请添加图片描述

2.6 04_使用JSONP获取腾讯天气信息.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>使用jsonp获取腾讯天气信息</title>
    <link rel="stylesheet" href="/assets/bootstrap/dist/css/bootstrap.min.css">
    <style type="text/css">
        .container {
            padding-top: 60px;
        }
    </style>
</head>

<body>
    <div class="container">
        <table class="table table-striped table-hover" align="center" id="box">

        </table>
    </div>
    <script src="/js/jsonp.js"></script>
    <script src="/js/template-web.js"></script>
    <script type="text/html" id="tpl">
        <tr>
            <th>时间</th>
            <th>温度</th>
            <th>天气</th>
            <th>风向</th>
            <th>风力</th>
        </tr>
        {{each info}}
        <tr>
            <td>{{dateFormat($value.update_time)}}</td>
            <td>{{$value.degree}}</td>
            <td>{{$value.weather}}</td>
            <td>{{$value.wind_direction}}</td>
            <td>{{$value.wind_power}}</td>
        </tr>
        {{/each}}
    </script>

    <script>
        var box = document.getElementById('box');
        function dateFormat(date) {
            // "20211004210000"
            var year = date.substr(0, 4);
            var month = date.substr(4, 2);
            var day = date.substr(6, 2);
            var hour = date.substr(8, 2);
            var minute = date.substr(10, 2);
            var seconds = date.substr(12, 2);
            return year + '年' + month + '月' + day + '日' + hour + '时' + minute + '分' + seconds + '秒';
        }
        // 向模板中导入全局变量
        template.defaults.imports.dateFormat = dateFormat;
        // 
        JSONP({
            url: 'https://wis.qq.com/weather/common',
            data: {
                source: 'pc',
                weather_type: 'forecast_1h',
                // weather_type: 'forecast_1h|forecast_24h',
                province: '黑龙江省',
                city: '哈尔滨市'
            },
            success: function (data) {
                console.log(data);
                var html = template('tpl', {
                    info: data.data.forecast_1h
                });
                box.innerHTML = html;
            }
        });
    </script>

</body>

</html>

请添加图片描述

2.7 05_CORS跨域资源共享.html

<!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>Document</title>
    <!-- 
        CORS: 跨域资源共享(非同源共享), 它允许浏览器向跨域服务器发送Ajax请求; 克服了Ajax只能同源的限制; 
        实现方法非常简单:只需在服务器端设置 允许哪些客户端可以访问服务器和允许客户端使用哪些请求方式访问服务器即可;
        客户端代码无需任何改变; 
    -->
</head>

<body>
    <button id="btn">点我发送请求</button>
    <script src="/js/ajax.js"></script>
    <script>
        var btn = document.getElementById('btn'); 
        btn.onclick = function() {
            AJAX({
                url: 'http://localhost:3002/cross',
                type: 'get', 
                success: function(result) {
                    console.log(result);
                }
            })
        }; 
    </script>
</body>

</html>

请添加图片描述

在这里插入图片描述

2.8 06_访问非同源数据的服务器解决方案.html

<!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>Document</title>
    <!-- 
        访问非同源端数据, 服务器端解决方案:
            同源政策是浏览器给予Ajax技术的限制, 服务器端是不存在同源政策的限制; 
                          请求                    请求
                        ``````>                 ``````>  
            A浏览器端              A服务器端                B服务器端
                        <``````<``````
                          响应                    响应
            此时就绕过了浏览器的同源政策限制;
     -->
    <!-- 
        点击按钮, 客户端向自己的服务器app1发送get请求; 
        当服务器app1接收到请求之后执行:request('http://localhost:3002/serverIndex', ... ...); 
        表示紧接着向app2服务器发送get请求(服务器与服务器之间不存在同源限制),  
     -->
     <!-- 
        好比说: 客户端要访问3002端口(非同源)服务器的数据, 
        首先自己的3001端口的服务器发起Ajax - get请求, 
        然后再由3001端口的服务器 向 3002端口的服务器发起请求,
        最后3002端口的服务器的响应到达3001端口的服务器, 
        最后再由3001端口的服务器将数据响应给客户端; 
      -->
</head>

<body>
    <button id="btn">点我发送请求</button>
    <script src="/js/ajax.js"></script>
    <script>
        var btn = document.getElementById('btn'); 
        btn.onclick = function() {
            AJAX({
                url: 'http://localhost:3001/server',
                type: 'get', 
                success: function(data) {
                    console.log('##################data is:> ' + data);
                }
            })
        }; 
    </script>
</body>

</html>

请添加图片描述

2.9 07_实现跨域登录功能.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>实现跨域登录功能</title>
    <link rel="stylesheet" href="/assets/bootstrap/dist/css/bootstrap.min.css">
	<style type="text/css">
		.container {
			padding-top: 60px;
		}
	</style>
    <!-- 
        withCredentials属性:
            在使用Ajax技术发送跨域请求时, 默认情况下不会在请求中携带cookie信息; 
			指定在涉及到跨域请求时, 是否携带cookie信息, 默认值为false;
            为了使得携带cookie信息, 需同时在客户端和服务端进行相应的设置, 二者缺一不可; 
                a. xhr.withCredentials = true; (client)
                b.res.header('Access-Control-Allow-Credentials', true); (server)
     -->
</head>

<body>
	<div class="container">
		<form id="loginForm">
			<div class="form-group">
				<label>用户名</label>
				<input type="text" name="username" class="form-control" placeholder="请输入用户名">
			</div>
			<div class="form-group">
				<label>密码</label>
				<input type="password" name="password" class="form-control" placeholder="请输入用密码">
			</div>
			<input type="button" class="btn btn-default" value="登录" id="loginBtn">
			<input type="button" class="btn btn-default" value="检测用户登录状态" id="checkLogin">
		</form>
	</div>

	<script type="text/javascript">
		var loginBtn = document.getElementById('loginBtn');
		var checkLogin = document.getElementById('checkLogin');
		var loginForm = document.getElementById('loginForm');

        // 登录按钮
		loginBtn.onclick = function () {
			var formData = new FormData(loginForm);
			var xhr = new XMLHttpRequest();
			xhr.open('post', 'http://localhost:3002/login');

			// 当发送跨域请求时,携带cookie信息
			xhr.withCredentials = true;

			xhr.send(formData);
			xhr.onload = function () {
				console.log(xhr.responseText);
			}
		}

		// 状态监测按钮
		checkLogin.onclick = function () {
			var xhr = new XMLHttpRequest();
			xhr.open('get', 'http://localhost:3002/checkLogin');
			xhr.withCredentials = true;
			xhr.send();
			xhr.onload = function () {
				console.log(xhr.responseText);
			}
		}
	</script>
</body>
</html>

请添加图片描述

3. app2

app2.js

const express = require('express');
const path = require('path');
const formidable = require('formidable');
// 引入session模块
var session = require('express-session');

const app = express();
app.use(express.static(path.join(__dirname, 'public')));


// 拦截所有请求
// app.use((req, res, next) => {
// 	// 允许哪些客户端可以访问服务器(*表所有客户端)
// 	res.header('Access-Control-Allow-Origin', '*');
// 	// 允许客户端使用哪些请求方法访问服务器
// 	res.header('Access-Control-Allow-Methods', 'get, post');

// 	// 允许客户端发送跨域请求时携带cookie信息
// 	res.header('Access-Control-Allow-Credentials'); 

// 	next(); 
// });


// 实现session功能
app.use(session({
	secret: 'keyboard cat',
	resave: false,
	saveUninitialized: false
}));


/* [0.] 通过jsonp实现非同源访问; */
app.get('/test', (req, res) => {
	res.send('fn({name: "ZhangSan"})');
});


/* [1.] jsonp实现非同源访问 

*/
app.get('/better', (req, res) => {
	
	// way1
	// 接收客户端传递过来的函数名
	/*const funName = req.query.callback;
	// 将函数名对应的函数调用代码返回给客户端
	const data = JSON.stringify({name: "ZhangSan"});
	const result = funName + '('+ data +')';
	console.log('result is:> ' + result);
	setTimeout(() => {
		res.send(result);
	}, 1000); */
	

	// way2
	res.jsonp({
		name: 'lisi',
		age: 20
	}); // jsonp()更为方便
});


/* [2.] CORS实现非同源访问 */
app.get('/cross', (req, res) => {

	// // 允许哪些客户端可以访问服务器(*表所有客户端)
	res.header('Access-Control-Allow-Origin', '*');
	// // 允许客户端使用哪些请求方法访问服务器
	res.header('Access-Control-Allow-Methods', 'get, post');

	res.send('88888888888888888888888888 -> ok!');
});


/* [3.] 见05_访问... */
app.get('/serverIndex', (req, res) => {
	res.send('***************************serverIndex...888');
});


/* [4.] 见06_实现... */
app.use((req, res, next) => {
	res.header('Access-Control-Allow-Origin', 'http://localhost:3001')
	res.header('Access-Control-Allow-Methods', 'get, post')
	// 允许客户端发送跨域请求时携带cookie信息
	res.header('Access-Control-Allow-Credentials', true);
	next();
});

app.post('/login', (req, res) => {
	// 创建表单解析对象
	var form = formidable.IncomingForm();
	// 解析表单
	form.parse(req, (err, fields, file) => {
		const {
			username,
			password
		} = fields;
		if (username == 'root' && password == '123456') {
			// 设置session
			req.session.isLogin = true;
			res.send({
				message: '登录成功'
			});
		} else {
			res.send({
				message: '登录失败, 用户名或密码错误'
			});
		}
	})
});

app.get('/checkLogin', (req, res) => {
	// 判断用户是否处于登录状态
	if (req.session.isLogin) {
		res.send({
			message: '处于登录状态'
		})
	} else {
		res.send({
			message: '处于未登录状态'
		})
	}
});




app.listen(3002, () => {
	console.log('server2 is listening on 3002......');
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——gunzip命令

在线Linux命令查询工具 gunzip 用来解压缩文件 补充说明 gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序&#xff0c;它用于解开被gzip压缩过的文件&#xff0c;这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接&#xff0c;因此不论是压缩或…

NodeJs之模板引擎及综合案例

0. 数据源 ./views/addtional.art {{ if age > 18 }}age > 18; {{ else if age < 15 }}age < 15; {{ else }}age!!!!!!!! {{/if}}<% if(age > 18){ %> 年龄大于18岁 <% } else if(age < 15) { %> 年龄小于15岁 <% } else { %> 其他年龄段…

Linux驱动开发(I2C系统的重要结构体)

文章目录 前言一、I2C硬件框架二、i2c_adapter三、i2c_client四、i2c_msg总结 前言 本篇文章来讲解I2C系统的重要结构体&#xff0c;了解这些结构体对于编写I2C驱动来说是至关重要的&#xff0c;所以要想编写好一个I2C驱动程序那么就必须先了解这些结构体。 一、I2C硬件框架 …

图片识别工具Tesseract与使用

Tesseract工具是一个图片识别工具&#xff0c; 由HP实验室开发 由Google维护的开源的光学字符识别&#xff08;OCR&#xff09;引擎。它可以直接使用&#xff0c;或者&#xff08;对于程序员&#xff09;使用 API​​ 从图像中提取输入&#xff0c;包括手写的或打印的文本。与M…

KCC@上海正式成立啦!

5月28号下午&#xff0c;开源社区的朋友共聚于上海的一间茶室中&#xff0c;组织召开了 KCC上海第一次线下见面会&#xff0c;并正式成立了 KCC上海。 KCC&#xff08;KAIYUANSHE City Community&#xff09;是由开源社理事兼执行长庄表伟老师号召发起&#xff0c;旨在让开源社…

关于职场中的面试,要是遇到这些问题时,应该怎么回

(点击即可收听) 关于职场中的面试,要是遇到这些问题时,应该怎么回 平常多学一点,面试入职时就少踩一点坑,无论是去面试还是换工作,怎么样去回答面试官,遇到此类的问题,能够应付自如 1. 你觉得这份工作你能胜任? 首先,无论你在面试过程当中表现怎么样,一定要非常坚定,一定可以 …

让身份验证更简单:OAuth2基于令牌方式为第三方应用提供认证和授权方案

随着互联网应用的发展&#xff0c;跨系统身份认证解决方案也在不断演化和改进。下面是它的发展史&#xff1a; 早期的 Web 应用程序使用基于表单的身份验证方式&#xff1b;随着 Web 应用程序数量的增加&#xff0c;需求跨应用程序身份验证的呼声也越来越高&#xff0c;从而出…

行胜于言

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 最近在给我女儿辅导作业的过程中&#xff0c;发现了许多小问题&#xff0c;自己偶尔也会因此而焦躁&#xff0c;同时也在反思作为父母应该更好的帮助孩子成长&#xff0c;而AI能力的增强和孩子的成长有什么相似…

【Python】Python系列教程--Python3 VScode(三)

文章目录 前言安装 VS Code 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09; 准备工作&#xff1a; 安装 VS Code安装 VS Code Python 扩展安装 Python 3 安装 VS Code VS…

Maven仓库(本地仓库+远程仓库)

在 Maven 中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为构件。 Maven 在某个统一的位置存储所有项目的构件&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。换言之&#xff0c;仓库就是存放依赖和插件的地方。 任何的构件都有唯一的坐标…

VUE代码批量格式化

1、下载安装Visual Studio Code 2、安装插件 Vetur和Format Files 3、配置格式化&#xff0c;点击右下角设置 4、自定义格式化规则 复制下面的配置信息&#xff0c;覆盖原始配置&#xff0c;保存配置。 {"vetur.format.defaultFormatter.html": "js-beauti…

MySQL数据库 6.DDL操作 表

目录 &#x1f914;前景知识&#xff1a; 数据类型&#xff1a; 1. 数值类型 2. 字符串类型 3. 日期时间类型 &#x1f914;DDL操作表&#xff1a; 1.创建 示例&#xff1a;尝试创建把以下实例创建到表里 2.查询 1.查询当前数据库的所有表&#xff1a; &#x1f50…

南京智慧工厂量产下线, 深蓝S7展现硬核制造品质

以科技之力构建电动出行体验&#xff0c;深蓝S7要用硬核实力树立高价值电动SUV全新标杆。 深蓝S7南京智慧工厂下线 作为深蓝汽车旗下的首款中型SUV&#xff0c;深蓝S7自从5月20日开启预定以来&#xff0c;就一直是许多车友关注的焦点&#xff0c;订单火爆更是远超预期&#xff…

设计模式之~职责链模式

简述&#xff1a; 职责链模式&#xff08;Chain of Responsibility&#xff09;&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为…

【哈希】位图/布隆过滤器

位图 前言 在实现位图结构之前我们先看一个问题&#xff1a; 给出40亿个不重复的无符号整型&#xff0c;并且是无序的。然后给一个无符号整数&#xff0c;怎样快速判断这个数是否在40亿个数之中。 方法一&#xff1a;对40亿个数据进行遍历。我们会发现&#xff0c;时间复杂度…

重启天涯,一场关于 “救命” 的直播

大家好&#xff0c;我是校长。 昨天在知乎热搜榜上看到了关于天涯网站的帖子&#xff0c;感觉值得思考。 前一段时间&#xff0c;我们就看到了关于天涯要关闭的新闻&#xff0c;感觉撑不下去了。 说实话&#xff0c;当时看到这个新闻的时候&#xff0c;挺感慨的&#xff0c;一个…

初识网络之UDP网络套接字

目录 一、UDP中的socket编程常用接口 1. socket的含义 2. sockaddr结构 3. socket编程中UDP协议常用接口介绍 3.1 创建socket文件描述符&#xff08;TCP/UDP、客户端 服务器&#xff09; 3.2 绑定端口号&#xff08;TCP/UDP&#xff0c;服务器&#xff09; 3.3 接收数据…

2023年上半年数据库系统工程师上午真题及答案解析

1.计算机中, 系统总线用于( )连接。 A.接口和外设 B.运算器、控制器和寄存器 C.主存及外设部件 D.DMA控制器和中断控制器 2.在由高速缓存、主存和硬盘构成的三级存储体系中&#xff0c;CPU执行指令时需要读取数据&#xff0c;那么DMA控制器和中断CPU发出的数据地…

聊聊我在淘宝做性能分析的经历

我们新推出大淘宝技术年度特刊《长期主义&#xff0c;往往从一些小事开始——工程师成长总结专题》&#xff0c;专题收录多位工程师真诚的心路历程与经验思考&#xff0c;覆盖终端、服务端、数据算法、技术质量等7大技术领域&#xff0c;欢迎一起沟通交流。 本文为此系列第三篇…

RNN基础概念

一、潜变量回归模型 使用潜变量 h t h_{t} ht​总结过去的信息 二、RNN 更新隐藏状态&#xff1a; h t φ ( W h h h t − 1 W h x x t − 1 b h ) h_{t}φ(W_{hh}h_{t-1}W_{hx}x_{t-1}b_{h}) ht​φ(Whh​ht−1​Whx​xt−1​bh​) 更新输出&#xff1a; o t W o h h t b…