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'

}

}

相关推荐
郑州光合科技余经理3 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
码哥DFS6 小时前
二叉树的直径
开发语言·javascript·算法
paopaokaka_luck7 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
Pluchon7 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生8 小时前
java开发工具(学习第一天)
java·开发语言·学习
她说可以呀8 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
啊啊啊啊啊!!!!9 小时前
【c++】stack和queue的接口使用以及底层实现
开发语言·c++
松仔log10 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才10 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li11 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库