mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
Add classification annotations
This commit is contained in:
@@ -7,6 +7,10 @@ import (
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// 结构体定义
|
||||
// ============================================================================
|
||||
|
||||
// DevModeConfig 开发模式配置
|
||||
type DevModeConfig struct {
|
||||
// 是否启用模板热重载
|
||||
@@ -19,6 +23,10 @@ type DevModeConfig struct {
|
||||
EnableDebugLog bool
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 中间件函数
|
||||
// ============================================================================
|
||||
|
||||
// DevModeMiddleware 开发模式中间件
|
||||
// 统一管理所有开发模式相关的功能
|
||||
func DevModeMiddleware(engine *gin.Engine) gin.HandlerFunc {
|
||||
@@ -45,6 +53,10 @@ func DevModeMiddleware(engine *gin.Engine) gin.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 公共函数
|
||||
// ============================================================================
|
||||
|
||||
// IsDevMode 检查是否为开发模式
|
||||
func IsDevMode() bool {
|
||||
return viper.GetBool("server.dev_mode")
|
||||
@@ -57,10 +69,10 @@ func GetDevModeConfig() DevModeConfig {
|
||||
}
|
||||
|
||||
return DevModeConfig{
|
||||
EnableTemplateReload: true, // 开发模式下默认启用模板热重载
|
||||
SkipCaptcha: true, // 开发模式下默认跳过验证码
|
||||
ShowDetailedErrors: true, // 开发模式下显示详细错误
|
||||
EnableDebugLog: true, // 开发模式下启用调试日志
|
||||
EnableTemplateReload: true, // 开发模式下默认启用模板热重载
|
||||
SkipCaptcha: true, // 开发模式下默认跳过验证码
|
||||
ShowDetailedErrors: true, // 开发模式下显示详细错误
|
||||
EnableDebugLog: true, // 开发模式下启用调试日志
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,9 +104,13 @@ func ShouldSkipCaptcha(c *gin.Context) bool {
|
||||
return config.SkipCaptcha
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 私有函数
|
||||
// ============================================================================
|
||||
|
||||
// reloadTemplates 重新加载模板(内部函数)
|
||||
func reloadTemplates(engine *gin.Engine) {
|
||||
if tmpl, err := web.ParseTemplates(); err == nil {
|
||||
engine.SetHTMLTemplate(tmpl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,97 +1,117 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"networkDev/utils/logger"
|
||||
)
|
||||
|
||||
// LoggingMiddleware 日志记录中间件结构体
|
||||
// 用于记录HTTP请求的详细信息,包括方法、路径、状态码和响应时间
|
||||
type LoggingMiddleware struct {
|
||||
logger *logger.Logger
|
||||
}
|
||||
|
||||
// NewLoggingMiddleware 创建新的日志记录中间件实例
|
||||
func NewLoggingMiddleware(logger *logger.Logger) *LoggingMiddleware {
|
||||
return &LoggingMiddleware{
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// Handler 返回Gin中间件函数,用于记录HTTP请求日志
|
||||
// 记录格式遵循Apache Common Log Format
|
||||
func (lm *LoggingMiddleware) Handler() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
// 记录开始时间
|
||||
start := time.Now()
|
||||
|
||||
// 处理请求
|
||||
c.Next()
|
||||
|
||||
// 计算处理时间
|
||||
duration := time.Since(start)
|
||||
|
||||
// 获取客户端IP
|
||||
clientIP := getClientIP(c)
|
||||
|
||||
// 记录日志 - Apache Common Log Format
|
||||
// 使用专门的HTTP日志方法避免User-Agent中的反斜杠被转义
|
||||
lm.logger.LogRequestWithHeaders(
|
||||
c.Request.Method,
|
||||
c.Request.RequestURI,
|
||||
clientIP,
|
||||
c.Writer.Status(),
|
||||
duration,
|
||||
"-", // referer (已废弃)
|
||||
c.Request.UserAgent(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// getClientIP 获取客户端真实IP地址
|
||||
// 优先从X-Forwarded-For、X-Real-IP等头部获取,最后使用RemoteAddr
|
||||
func getClientIP(c *gin.Context) string {
|
||||
// 检查X-Forwarded-For头部
|
||||
xForwardedFor := c.GetHeader("X-Forwarded-For")
|
||||
if xForwardedFor != "" {
|
||||
// X-Forwarded-For可能包含多个IP,取第一个
|
||||
ips := strings.Split(xForwardedFor, ",")
|
||||
if len(ips) > 0 {
|
||||
return strings.TrimSpace(ips[0])
|
||||
}
|
||||
}
|
||||
|
||||
// 检查X-Real-IP头部
|
||||
xRealIP := c.GetHeader("X-Real-IP")
|
||||
if xRealIP != "" {
|
||||
return xRealIP
|
||||
}
|
||||
|
||||
// 检查X-Forwarded头部
|
||||
xForwarded := c.GetHeader("X-Forwarded")
|
||||
if xForwarded != "" {
|
||||
return xForwarded
|
||||
}
|
||||
|
||||
// 使用RemoteAddr
|
||||
remoteAddr := c.Request.RemoteAddr
|
||||
if strings.Contains(remoteAddr, ":") {
|
||||
// 移除端口号
|
||||
if idx := strings.LastIndex(remoteAddr, ":"); idx != -1 {
|
||||
return remoteAddr[:idx]
|
||||
}
|
||||
}
|
||||
|
||||
return remoteAddr
|
||||
}
|
||||
|
||||
// WrapHandler 创建Gin日志中间件
|
||||
// 使用全局日志记录器创建日志中间件
|
||||
func WrapHandler() gin.HandlerFunc {
|
||||
logger := logger.GetLogger()
|
||||
middleware := NewLoggingMiddleware(logger)
|
||||
return middleware.Handler()
|
||||
}
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"networkDev/utils/logger"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// 结构体定义
|
||||
// ============================================================================
|
||||
|
||||
// LoggingMiddleware 日志记录中间件结构体
|
||||
// 用于记录HTTP请求的详细信息,包括方法、路径、状态码和响应时间
|
||||
type LoggingMiddleware struct {
|
||||
logger *logger.Logger
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 构造函数
|
||||
// ============================================================================
|
||||
|
||||
// NewLoggingMiddleware 创建新的日志记录中间件实例
|
||||
func NewLoggingMiddleware(logger *logger.Logger) *LoggingMiddleware {
|
||||
return &LoggingMiddleware{
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 中间件函数
|
||||
// ============================================================================
|
||||
|
||||
// Handler 返回Gin中间件函数,用于记录HTTP请求日志
|
||||
// 记录格式遵循Apache Common Log Format
|
||||
func (lm *LoggingMiddleware) Handler() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
// 记录开始时间
|
||||
start := time.Now()
|
||||
|
||||
// 处理请求
|
||||
c.Next()
|
||||
|
||||
// 计算处理时间
|
||||
duration := time.Since(start)
|
||||
|
||||
// 获取客户端IP
|
||||
clientIP := getClientIP(c)
|
||||
|
||||
// 记录日志 - Apache Common Log Format
|
||||
// 使用专门的HTTP日志方法避免User-Agent中的反斜杠被转义
|
||||
lm.logger.LogRequestWithHeaders(
|
||||
c.Request.Method,
|
||||
c.Request.RequestURI,
|
||||
clientIP,
|
||||
c.Writer.Status(),
|
||||
duration,
|
||||
"-", // referer (已废弃)
|
||||
c.Request.UserAgent(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 私有函数
|
||||
// ============================================================================
|
||||
|
||||
// getClientIP 获取客户端真实IP地址
|
||||
// 优先从X-Forwarded-For、X-Real-IP等头部获取,最后使用RemoteAddr
|
||||
func getClientIP(c *gin.Context) string {
|
||||
// 检查X-Forwarded-For头部
|
||||
xForwardedFor := c.GetHeader("X-Forwarded-For")
|
||||
if xForwardedFor != "" {
|
||||
// X-Forwarded-For可能包含多个IP,取第一个
|
||||
ips := strings.Split(xForwardedFor, ",")
|
||||
if len(ips) > 0 {
|
||||
return strings.TrimSpace(ips[0])
|
||||
}
|
||||
}
|
||||
|
||||
// 检查X-Real-IP头部
|
||||
xRealIP := c.GetHeader("X-Real-IP")
|
||||
if xRealIP != "" {
|
||||
return xRealIP
|
||||
}
|
||||
|
||||
// 检查X-Forwarded头部
|
||||
xForwarded := c.GetHeader("X-Forwarded")
|
||||
if xForwarded != "" {
|
||||
return xForwarded
|
||||
}
|
||||
|
||||
// 使用RemoteAddr
|
||||
remoteAddr := c.Request.RemoteAddr
|
||||
if strings.Contains(remoteAddr, ":") {
|
||||
// 移除端口号
|
||||
if idx := strings.LastIndex(remoteAddr, ":"); idx != -1 {
|
||||
return remoteAddr[:idx]
|
||||
}
|
||||
}
|
||||
|
||||
return remoteAddr
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 公共函数
|
||||
// ============================================================================
|
||||
|
||||
// WrapHandler 创建Gin日志中间件
|
||||
// 使用全局日志记录器创建日志中间件
|
||||
func WrapHandler() gin.HandlerFunc {
|
||||
logger := logger.GetLogger()
|
||||
middleware := NewLoggingMiddleware(logger)
|
||||
return middleware.Handler()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user