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'

}

}

相关推荐
艾迪的技术之路14 分钟前
redisson使用lock导致死锁问题
java·后端·面试
qianbo_insist18 分钟前
c++ python 共享内存
开发语言·c++·python
今天背单词了吗98032 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师35 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
CoderPractice38 分钟前
C#控制台小项目-飞行棋
开发语言·c#·小游戏·飞行棋
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
程序猿阿伟1 小时前
《声音的变形记:Web Audio API的实时特效法则》
开发语言·前端·php
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全