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'

}

}

相关推荐
yuanbenshidiaos22 分钟前
c语言-----函数知识点
java·c语言·前端
YRr YRr32 分钟前
详解ROS环境配置:setup.bash 文件的功能与操作
开发语言·bash
夜空晚星灿烂39 分钟前
C# 文件系统I/O操作--Directory类与DirectoryInfo类
服务器·开发语言·c#
ahhhhaaaa-44 分钟前
【AI图像生成网站&Golang】项目测试与优化
开发语言·后端·性能优化·golang·pprof·trace
shinelord明1 小时前
【再谈设计模式】外观模式~复杂系统交互的简化大师
开发语言·数据结构·设计模式·软件工程
有点困的拿铁1 小时前
Spring篇--xml方式整合第三方框架
xml·java·spring
武子康1 小时前
Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入
xml·java·开发语言·后端·spring·mybatis·springboot
lsx2024061 小时前
XML Schema 复合类型 - 混合内容
开发语言
lichong9511 小时前
【Harmony】@ohos.multimedia.audioHaptic (音振协同)填坑版~7
开发语言·javascript·ecmascript