diff --git a/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java b/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java
index a9ac1b8..37815fa 100644
--- a/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java
+++ b/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java
@@ -33,7 +33,11 @@ public class GlobalExceptionHandler {
*/
@ExceptionHandler(ServiceException.class)
public R handleServiceException(ServiceException e, HttpServletRequest request) {
- log.error(e.getMessage(), e);
+ if ("token异常".equals(e.getMessage())) {
+ log.error("用户token异常");
+ } else {
+ log.error(e.getMessage(), e);
+ }
Integer code = e.getCode();
return StringUtils.isNotNull(code) ? R.error(code, e.getMessage()) : R.error(e.getMessage());
}
@@ -105,7 +109,12 @@ public class GlobalExceptionHandler {
*/
@ExceptionHandler(CustomException.class)
public R customException(CustomException e) {
- log.error(e.getMessage(), e);
+ if ("token异常".equals(e.getMessage())) {
+ log.error("用户token异常");
+ } else {
+ log.error(e.getMessage(), e);
+ }
+
return R.error(e.getMessage());
}
}
diff --git a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java
index 0588a64..1d8192a 100644
--- a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java
+++ b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java
@@ -81,8 +81,16 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, @NotNull HttpServletResponse httpServletResponse, @NotNull FilterChain filterChain) throws ServletException, IOException {
log.info("url = {}", httpServletRequest.getRequestURI());
+
+// //微信支付回调接口,不需要验证
+ if ("/wx/pay/jsCallback".equals(httpServletRequest.getServletPath())) {
+ filterChain.doFilter(httpServletRequest, httpServletResponse);
+ return;
+ }
+
// 微信公众号的请求,必须存在tenantkey,否则抛出异常
if (httpServletRequest.getServletPath().startsWith("/wx/")) {
+
String tenantKey = httpServletRequest.getHeader("tenantkey");
if (StrUtil.isBlank(tenantKey)) {
resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("tenantkey不能为空"));
diff --git a/play-admin/src/main/resources/ip2region/ip2region.db b/play-admin/src/main/resources/ip2region/ip2region.db
new file mode 100644
index 0000000..3b6a296
Binary files /dev/null and b/play-admin/src/main/resources/ip2region/ip2region.db differ
diff --git a/play-common/pom.xml b/play-common/pom.xml
index 4754aec..0bf07d1 100644
--- a/play-common/pom.xml
+++ b/play-common/pom.xml
@@ -104,6 +104,12 @@
gson
+
+
+ org.lionsoul
+ ip2region
+
+
com.alibaba
transmittable-thread-local
diff --git a/play-common/src/main/java/com/starry/common/utils/RegionUtils.java b/play-common/src/main/java/com/starry/common/utils/RegionUtils.java
new file mode 100644
index 0000000..87cb53d
--- /dev/null
+++ b/play-common/src/main/java/com/starry/common/utils/RegionUtils.java
@@ -0,0 +1,106 @@
+package com.starry.common.utils;
+
+/**
+ * @author admin
+ * @since 2024/7/25 下午3:15
+ **/
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.lionsoul.ip2region.DataBlock;
+import org.lionsoul.ip2region.DbConfig;
+import org.lionsoul.ip2region.DbSearcher;
+import org.lionsoul.ip2region.Util;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.File;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+/**
+ * 根据ip离线查询地址
+ *
+ * @author admin
+ */
+@Slf4j
+public class RegionUtils {
+
+ private static final String JAVA_TEMP_DIR = "java.io.tmpdir";
+
+ static DbConfig config = null;
+ static DbSearcher searcher = null;
+
+ /**
+ * 初始化IP库
+ */
+ static {
+ try {
+ // 因为jar无法读取文件,复制创建临时文件
+ String dbPath = Objects.requireNonNull(RegionUtils.class.getResource("/ip2region/ip2region.db")).getPath();
+ File file = new File(dbPath);
+ if (!file.exists()) {
+ String tmpDir = System.getProperties().getProperty(JAVA_TEMP_DIR);
+ dbPath = tmpDir + "ip2region.db";
+ file = new File(dbPath);
+ ClassPathResource cpr = new ClassPathResource("ip2region" + File.separator + "ip2region.db");
+ InputStream resourceAsStream = cpr.getInputStream();
+ FileUtils.copyInputStreamToFile(resourceAsStream, file);
+ }
+ config = new DbConfig();
+ searcher = new DbSearcher(config, dbPath);
+ log.info("bean [{}]", config);
+ log.info("bean [{}]", searcher);
+ } catch (Exception e) {
+ log.error("init ip region error:", e);
+ }
+ }
+
+ /**
+ * 解析IP
+ *
+ * @param ip
+ * @return
+ */
+ public static String getRegion(String ip) {
+ try {
+ // db
+ if (searcher == null || StringUtils.isEmpty(ip)) {
+ log.error("DbSearcher is null");
+ return StringUtils.EMPTY;
+ }
+ long startTime = System.currentTimeMillis();
+ // 查询算法
+ int algorithm = DbSearcher.MEMORY_ALGORITYM;
+ Method method = null;
+ switch (algorithm) {
+ case DbSearcher.BTREE_ALGORITHM:
+ method = searcher.getClass().getMethod("btreeSearch", String.class);
+ break;
+ case DbSearcher.BINARY_ALGORITHM:
+ method = searcher.getClass().getMethod("binarySearch", String.class);
+ break;
+ case DbSearcher.MEMORY_ALGORITYM:
+ method = searcher.getClass().getMethod("memorySearch", String.class);
+ break;
+ default:
+ return StringUtils.EMPTY;
+ }
+
+ DataBlock dataBlock = null;
+ if (!Util.isIpAddress(ip)) {
+ log.warn("warning: Invalid ip address");
+ }
+ dataBlock = (DataBlock) method.invoke(searcher, ip);
+ String result = dataBlock.getRegion();
+ long endTime = System.currentTimeMillis();
+ log.debug("region use time[{}] result[{}]", endTime - startTime, result);
+ return result;
+
+ } catch (Exception e) {
+ log.error("error:", e);
+ }
+ return StringUtils.EMPTY;
+ }
+
+}
\ No newline at end of file
diff --git a/play-common/src/main/java/com/starry/common/utils/ip/AddressUtils.java b/play-common/src/main/java/com/starry/common/utils/ip/AddressUtils.java
index 136ccf4..dd4ed9e 100644
--- a/play-common/src/main/java/com/starry/common/utils/ip/AddressUtils.java
+++ b/play-common/src/main/java/com/starry/common/utils/ip/AddressUtils.java
@@ -1,9 +1,7 @@
package com.starry.common.utils.ip;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.starry.common.utils.HttpUtils;
+import com.starry.common.utils.RegionUtils;
import com.starry.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
@@ -27,21 +25,20 @@ public class AddressUtils {
public static String getRealAddressByIp(String ip) {
if ("127.0.0.1".equals(ip)) {
return "内网IP";
- } else {
- try {
- String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", "GBK");
- if (StringUtils.isEmpty(rspStr)) {
- log.error("获取地理位置异常 {}", ip);
- return UNKNOWN;
- }
- JSONObject obj = JSON.parseObject(rspStr);
- String region = obj.getString("pro");
- String city = obj.getString("city");
- return String.format("%s %s", region, city);
- } catch (Exception e) {
- log.error("获取地理位置异常 {}", ip);
- }
- return UNKNOWN;
}
+ try {
+ String rspStr = RegionUtils.getRegion(ip);
+ if (StringUtils.isEmpty(rspStr)) {
+ log.error("获取地理位置异常 {}", ip);
+ return UNKNOWN;
+ }
+ String[] obj = rspStr.split("\\|");
+ String region = obj[2];
+ String city = obj[3];
+ return String.format("%s %s", region, city);
+ } catch (Exception e) {
+ log.error("获取地理位置异常", e);
+ }
+ return UNKNOWN;
}
}
diff --git a/pom.xml b/pom.xml
index f4926ec..1782c22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -228,6 +228,14 @@
3.4.0
+
+
+ org.lionsoul
+ ip2region
+ 1.7.2
+
+
+