ERPStoreAppHttpServlet.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.dderp.common.base;
  2. import com.dderp.common.api.NoSqlKeysService;
  3. import com.dderp.common.api.StoreService;
  4. import com.dderp.common.datas.ERPHeader;
  5. import com.dderp.common.datas.HttpCode;
  6. import com.dderp.common.datas.RedisKeys;
  7. import com.dderp.common.entity.site.ERPTokenUser;
  8. import com.dderp.common.entity.store.StoreInfo;
  9. import com.dderp.common.tool.ERPUtils;
  10. import com.dySweetFishPlugin.redis.RedisService;
  11. import com.dySweetFishPlugin.sql.RMapUtils;
  12. import com.sweetfish.convert.json.JsonConvert;
  13. import com.sweetfish.net.http.*;
  14. import com.sweetfish.util.AnyValue;
  15. import com.sweetfish.util.AutoLoad;
  16. import org.apache.logging.log4j.LogManager;
  17. import org.apache.logging.log4j.Logger;
  18. import javax.annotation.Resource;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import static com.sweetfish.net.Server.RESNAME_SERVER_ROOT;
  22. @AutoLoad(false)
  23. @HttpUserType(ERPTokenUser.class)
  24. public class ERPStoreAppHttpServlet extends HttpServlet {
  25. protected final Logger logger = LogManager.getLogger(this.getClass().getSimpleName());
  26. @Resource
  27. protected NoSqlKeysService keysService;
  28. @Resource
  29. protected RedisService redisService;
  30. @Resource
  31. protected StoreService storeService;
  32. @Resource(name = RESNAME_SERVER_ROOT)
  33. File webRoot;
  34. @Resource(name = "property.deliver.Store.commonkey")
  35. private String ssoStoreTokenCommonKey;
  36. @Resource
  37. JsonConvert jsonConvert;
  38. @Override
  39. public void init(HttpContext context, AnyValue config) {
  40. super.init(context, config);
  41. }
  42. /**
  43. * 获取当前用户
  44. *
  45. * @param request http请求
  46. * @return 当前用户信息
  47. */
  48. public ERPTokenUser currentUser(HttpRequest request) {
  49. //先判断请求中是否有
  50. ERPTokenUser user = request.currentUser();
  51. if (user != null) {
  52. return user;
  53. }
  54. //没有则判断token
  55. String token = ERPUtils.parseHttpToken(request);
  56. return ERPUtils.parseERPUserFromToken(token, ssoStoreTokenCommonKey, jsonConvert);
  57. }
  58. @Override
  59. protected void preExecute(HttpRequest request, HttpResponse response) throws IOException {
  60. //注册一个监听器
  61. response.recycleListener((req, resp) -> {
  62. //记录超过5秒的请求
  63. long e = System.currentTimeMillis() - req.getCreatetime();
  64. if (e > 50000) {
  65. logger.info("http-execute-cost-time: " + e + " ms. request = " + req);
  66. }
  67. });
  68. //设置当前用户
  69. ERPTokenUser userInfo = currentUser(request);
  70. request.setCurrentUser(userInfo);
  71. response.nextEvent();
  72. }
  73. @Override
  74. protected void authenticate(HttpRequest request, HttpResponse response) throws IOException {
  75. ERPTokenUser info = request.currentUser();
  76. long supplierCode = request.getLongHeader(ERPHeader.HTTPHEADER_SUPPLIER, 0);
  77. if (info == null) {
  78. //判断是否登录
  79. if ("/xdoc/index".equalsIgnoreCase(request.getRequestURI())) {
  80. File api = new File(webRoot, "apilogin.html");
  81. response.finishFile(api, null);
  82. } else {
  83. response.finishJson(RMapUtils.error(HttpCode.UNAUTHORIZED.value(), "未登录"));
  84. }
  85. return;
  86. } else {
  87. //判断门店是否作废
  88. StoreInfo storeInfo = storeService.getStoreInfo(info.getIdBindOrg(), supplierCode, false, false, false);
  89. if (storeInfo == null) {
  90. response.finishJson(RMapUtils.error(HttpCode.UNAUTHORIZED.value(), "未登录"));
  91. return;
  92. }
  93. if (storeInfo.getVoidFlag() == 1) {
  94. response.finishJson(RMapUtils.error(HttpCode.UNAUTHORIZED.value(), "未登录"));
  95. return;
  96. }
  97. }
  98. //验证通过调用执行方法
  99. response.nextEvent();
  100. }
  101. @Override
  102. public boolean checkRequestCount(HttpRequest request, HttpResponse response, int limitCount, long limitTime) {
  103. String ip = request.getRemoteAddr();
  104. String url = request.getRequestURI();
  105. String key = keysService.getRedisKey(RedisKeys.KEY_REQUESTLIMIT, 0L, true).concat(url).concat(ip);
  106. long count = redisService.incrby(key, 1);
  107. if (count == 1) {
  108. redisService.pexpire(key, limitTime);
  109. }
  110. if (count > limitCount) {
  111. logger.info("用户IP[" + ip + "]访问地址[" + url + "]超过了限定的次数[" + limitCount + "]");
  112. response.finishJson(RMapUtils.error(HttpCode.MULTI_STATUS.value(), "请求超过了限定的次数"));
  113. return false;
  114. }
  115. return true;
  116. }
  117. @Override
  118. public void responseMethodReturn(HttpRequest request, HttpResponse response, String requestMethod, String actMethod) {
  119. response.finishJson(RMapUtils.error(HttpCode.BAD_REQUEST.value(), request.getRequestURI() + "Method(" + requestMethod + ") Error (" + actMethod + ")"));
  120. }
  121. }