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 + + +