12.9【java exp4】[study]

  • access_by_lua_block:
    • 使用 Lua 脚本进行鉴权操作。
    • local res = ngx.location.capture("/auth/check", { method = ngx.HTTP_GET, args = { token = ngx.var.http_authorization } }):
      • 发送一个 GET 请求到 /auth/check 路径,传递 token 参数,其值为客户端请求中的 Authorization 头部。
    • if res.status ~= 200 then ngx.exit(res.status) end:
      • 如果鉴权服务器返回的状态码不是 200(即鉴权失败),则直接返回鉴权服务器的响应状态码给客户端。
  1. 带有 Bearer Token 的请求:

    复制代码

    http

    GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

  2. 带有 Basic Auth 的请求:

    复制代码

    http

    GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

  3. 带有自定义 Token 的请求:

    复制代码

    http

    GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: CustomToken 1234567890abcdef

解释

  • Authorization 头部:

    • 这个头部用于传递鉴权信息。在 Nginx 配置中,ngx.var.http_authorization 获取的就是这个头部的值。
    • Bearer 是最常见的 JWT(JSON Web Token)格式。
    • Basic 是 Base64 编码的用户名和密码。
    • CustomToken 是自定义的鉴权格式。

浏览器在发送 HTTP 请求时会自动添加一些请求头,主要包括以下几种:

User-Agent: 提供关于浏览器的信息。

Accept: 指定客户端能够处理的内容类型。

Accept-Language: 指定客户端偏好的语言。

Accept-Encoding: 指定客户端支持的压缩编码格式。

Connection: 控制网络连接的持久性(例如,keep-alive 或 close)。

Host: 指定请求的目标主机和端口。

Referer: 指定当前请求的来源页面。

Origin: 指定请求的源域名,主要用于跨域请求。

Cache-Control: 控制缓存行为。

Cookie: 包含与请求相关的 cookie 信息

Next.js 的 Middleware 是一种中间件机制,允许你在请求到达最终的页面或 API 路由之前拦截和处理这些请求。Middleware 可以用于多种用途,包括身份验证、重定向、修改请求头等

主要功能

  1. 请求拦截:可以在请求到达目标路由之前进行拦截,从而执行一些操作。
  2. 身份验证:检查用户是否已登录,并根据结果决定是否继续处理请求或重定向到登录页面。
  3. 重定向:可以根据条件将请求重定向到其他 URL。
  4. 修改请求头:可以在请求中添加、删除或修改请求头信息。
  5. 缓存控制:可以通过设置响应头来控制缓存行为。
  6. 日志记录:记录每个请求的信息,便于调试和分析。

使用场景

  • 访问控制:限制某些页面只能被特定用户访问。
  • 国际化:根据用户的语言偏好自动重定向到相应的语言版本。
  • 性能优化:通过缓存策略减少服务器负载。
  • 安全性增强:防止恶意请求和攻击。

如何使用

要在 Next.js 中使用 Middleware,你需要创建一个名为 _middleware.js_middleware.ts 文件,并将其放在你想要应用 Middleware 的目录下(例如,在根目录下的 _middleware.js 将应用于所有请求)。

{ ...options, headers }:

这是一个对象字面量,用于配置 fetch 请求的各种选项。

...options:

...options 是对象展开运算符,它将 options 对象的所有属性复制到新的对象中。

例如,如果 options 是 { method: 'POST', body: JSON.stringify({ key: 'value' }) },那么 ...options 会将这些属性展开到新对象中。

headers:

headers 是一个 Headers 对象,包含了请求头信息。

通过这种方式,你可以确保 headers 对象中的所有头部信息都被添加到请求中。

如果 options 对象中已经有一个 headers 属性,那么 headers 对象会覆盖 options 中的 headers 属性。

{ ...options, headers } 会展开 options 对象的所有属性,并添加或覆盖 headers 属性。

最终的对象将类似于:

{

method: 'POST',

body: '{"key":"value"}',

headers: Headers {

'Content-Type': 'application/json',

'Authorization': 'Bearer your-jwt-token'

}

}

相关推荐
一路往蓝-Anbo4 分钟前
【第42期】调试进阶(一):IDE中的Register与Memory窗口
c语言·开发语言·ide·stm32·单片机·嵌入式硬件
m0_7482495410 分钟前
Java 语言提供了八种基本类型【文123】
java·开发语言·python
移幻漂流15 分钟前
Kotlin 如何解决 Java 的核心痛点:现代语言特性的深度剖析
java·python·kotlin
leikooo17 分钟前
ShardingSphere 下更新分片键导致的失败问题分析与解决
java·spring·apache
a程序小傲19 分钟前
中国邮政Java面试被问:Netty的FastThreadLocal优化原理
java·服务器·开发语言·面试·职场和发展·github·哈希算法
jay神23 分钟前
基于Java的水果网上订购平台
java·mysql·vue·springboot·计算机毕业设计
淦。。。。23 分钟前
题解:P14013 [POCamp 2023] 送钱 / The Generous Traveler
开发语言·c++·经验分享·学习·其他·娱乐·新浪微博
小北方城市网26 分钟前
SpringBoot 集成 MyBatis-Plus 实战(高效 CRUD 与复杂查询):简化数据库操作
java·数据库·人工智能·spring boot·后端·安全·mybatis
小白不会Coding28 分钟前
一文详解JVM中类的生命周期
java·jvm·类的生命周期
橙露28 分钟前
C#在视觉检测中的优势:工业智能化转型的利器
开发语言·c#·视觉检测