package middleware import ( . "bp.jydev.jianyu360.cn/BaseService/gateway/common/gatecode" "bp.jydev.jianyu360.cn/BaseService/gateway/common/httpUtil" "bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/filterPoly" "bp.jydev.jianyu360.cn/BaseService/gateway/core/router" "fmt" "github.com/gogf/gf/v2/net/ghttp" "strings" ) const ( defaultVerifyPageHtml = "default" VerifyPageHtmlSource = "./resources/antiRes/page/%s.html" ) var filterPolyManager *filterPoly.Manager func InitFilterPolyManager() { filterPolyManager = filterPoly.InitFilterPolyManager() } func FilterPolyHandler(r *ghttp.Request) { ctx := r.GetCtx() gCtx := router.GetGContext(ctx) //获取策略 poly := filterPolyManager.GetRule(gCtx.RouterRule.LimitPloy) status, key := func() (int, string) { if gCtx.Sess.UserId != "" && poly.Rule.BCheckId { //id请求频率校验 return poly.IdFilter(ctx, gCtx.Sess.UserId) } else { //ip请求频率校验 return poly.IpFilter(ctx, r.GetClientIp()) } }() returnHtml := false if strings.Contains(strings.ToLower(r.Header.Get("Accept")), "html") { returnHtml = true } //是否开启黑名单 if status == -1 { //黑名单 不响应 r.SetError(NewErrorWithCode(OTHER_ERR_OFTEN, fmt.Sprintf("请求频繁限制"))) r.Response.ResponseWriter.WriteHeader(403) return } if status == 2 { //处理验证码逻辑 rData := poly.VerifyHandle(r.Request, key) if !returnHtml { r.Response.WriteJsonExit(rData) } else { if renderErr := httpUtil.Render(r.Response.ResponseWriter, getVerifyPage(poly.Rule.VerifyPage), &rData); renderErr != nil { r.SetError(NewErrorWithCode(GATEWAY_HTML_RENDER_ERR, fmt.Sprintf("验证码页面:%v\n", renderErr))) } } return } r.Middleware.Next() } //getVerifyPage 获取验证码页面路径 func getVerifyPage(page string) string { if page != "" { if strings.HasSuffix(page, ".html") { page = strings.ReplaceAll(page, ".html", "") } return fmt.Sprintf(VerifyPageHtmlSource, page) } else { return fmt.Sprintf(VerifyPageHtmlSource, defaultVerifyPageHtml) } }