spiderPolyHandler.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package middleware
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. . "bp.jydev.jianyu360.cn/BaseService/gateway/common/gatecode"
  5. "bp.jydev.jianyu360.cn/BaseService/gateway/common/httpUtil"
  6. "bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/filterPoly"
  7. "bp.jydev.jianyu360.cn/BaseService/gateway/core/router"
  8. "fmt"
  9. "github.com/gogf/gf/v2/net/ghttp"
  10. "github.com/gogf/gf/v2/net/gtrace"
  11. "strings"
  12. )
  13. const (
  14. defaultVerifyPageHtml = "default"
  15. VerifyPageHtmlSource = "./resources/antiRes/page/%s.html"
  16. )
  17. var filterPolyManager *filterPoly.Manager
  18. func InitFilterPolyManager() {
  19. filterPolyManager = filterPoly.InitFilterPolyManager()
  20. }
  21. func FilterPolyHandler(r *ghttp.Request) {
  22. func() {
  23. ctx, span := gtrace.NewSpan(r.Context(), "FilterPolyHandler")
  24. defer span.End()
  25. gCtx := router.GetGContext(ctx)
  26. //获取策略
  27. poly := filterPolyManager.GetRule(gCtx.RouterRule.LimitPloy)
  28. status, key := func() (int, string) {
  29. //用户身份切换
  30. userFlag, _ := common.If(gCtx.Sess.MgoUserId != "", gCtx.Sess.MgoUserId, gCtx.Sess.UserId).(string)
  31. if gCtx.Sess.UserId != "" && poly.Rule.BCheckId { //id请求频率校验
  32. return poly.IdFilter(ctx, userFlag)
  33. } else { //ip请求频率校验
  34. return poly.IpFilter(ctx, r.GetClientIp())
  35. }
  36. }()
  37. returnHtml := false
  38. if strings.Contains(strings.ToLower(r.Header.Get("Accept")), "html") {
  39. returnHtml = true
  40. }
  41. //是否开启黑名单
  42. if status == -1 { //黑名单 不响应
  43. r.SetError(NewErrorWithCode(OTHER_ERR_OFTEN, fmt.Sprintf("请求频繁限制")))
  44. r.Response.ResponseWriter.WriteHeader(403)
  45. return
  46. }
  47. if status == 2 { //处理验证码逻辑
  48. rData := poly.VerifyHandle(r.Request, key)
  49. if !returnHtml {
  50. r.Response.WriteJsonExit(rData)
  51. } else {
  52. if renderErr := httpUtil.Render(r.Response.ResponseWriter, getVerifyPage(poly.Rule.VerifyPage), &rData); renderErr != nil {
  53. r.SetError(NewErrorWithCode(GATEWAY_HTML_RENDER_ERR, fmt.Sprintf("验证码页面:%v\n", renderErr)))
  54. }
  55. }
  56. return
  57. }
  58. }()
  59. r.Middleware.Next()
  60. }
  61. // getVerifyPage 获取验证码页面路径
  62. func getVerifyPage(page string) string {
  63. if page != "" {
  64. if strings.HasSuffix(page, ".html") {
  65. page = strings.ReplaceAll(page, ".html", "")
  66. }
  67. return fmt.Sprintf(VerifyPageHtmlSource, page)
  68. } else {
  69. return fmt.Sprintf(VerifyPageHtmlSource, defaultVerifyPageHtml)
  70. }
  71. }