threadLocal = new ThreadLocal<>();
-
- /**
- * 获取锁
- */
- private RLock getLock(String key, Integer lockType) {
- Assert.isTrue(StrUtil.isNotBlank(key), "key不能为空");
- threadLocal.set(lockType);
- RLock lock;
- if (BASE_LOCK.equals(lockType)) {
- lock = redissonClient.getLock(key);
- } else if (FAIR_LOCK.equals(lockType)) {
- lock = redissonClient.getFairLock(key);
- } else {
- throw new RuntimeException("锁不存在!");
- }
- return lock;
- }
-
- /**
- * 获取锁(不用设置超时时间,一直等待)
- */
- public boolean getLock(String key) {
- RLock lock = getLock(key, BASE_LOCK);
- return lock.tryLock();
- }
-
- /**
- * 设置过期时间
- *
- * @param key
- * @param time 过期时间
- * @param expireUnit 时间单位
- */
- public boolean getLock(String key, long time, TimeUnit expireUnit) {
- Assert.isTrue(time > 0, "过期时间必须大于0");
- Assert.isTrue(Validator.isNotEmpty(expireUnit), "时间单位不能为空");
- RLock lock = getLock(key, BASE_LOCK);
- try {
- return lock.tryLock(time, expireUnit);
- } catch (InterruptedException e) {
- e.printStackTrace();
- return false;
- }
- }
-
- /**
- * 设置过期时间
- *
- * @param key
- * @param waitTime 获取锁等待时间
- * @param leaseTime 保留锁的时间
- * @param expireUnit 时间单位
- */
- public boolean getLock(String key, long waitTime, long leaseTime, TimeUnit expireUnit) {
- Assert.isTrue(waitTime > 0, "获取锁等待时间必须大于0");
- Assert.isTrue(leaseTime > 0, "保留锁的时间必须大于0");
- Assert.isTrue(Validator.isNotEmpty(expireUnit), "时间单位不能为空");
- RLock lock = getLock(key, BASE_LOCK);
- try {
- return lock.tryLock(waitTime, leaseTime, expireUnit);
- } catch (InterruptedException e) {
- e.printStackTrace();
- return false;
- }
- }
-
-
- /**
- * 获取计数器锁
- *
- * @param key
- * @param count countDownLatch 的数量
- */
- public RCountDownLatch getCountDownLatch(String key, long count) {
- Assert.isTrue(count >= 0, "count数量必须大于等于0");
- RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch(key);
- rCountDownLatch.trySetCount(count);
- return rCountDownLatch;
- }
-
- /**
- * 获取公平锁
- *
- * @param key
- * @param waitTime 获取锁等待时间
- * @param leaseTime 持有锁的时间
- * @param expireUnit 时间单位
- * @return
- * @throws InterruptedException
- */
- public boolean getFairLock(String key, long waitTime, long leaseTime, TimeUnit expireUnit) {
- Assert.isTrue(waitTime > 0, "获取锁等待时间必须大于0");
- Assert.isTrue(leaseTime > 0, "保留锁的时间必须大于0");
- Assert.isTrue(Validator.isNotEmpty(expireUnit), "时间单位不能为空");
- RLock lock = getLock(key, FAIR_LOCK);
- try {
- return lock.tryLock(waitTime, leaseTime, expireUnit);
- } catch (InterruptedException e) {
- e.printStackTrace();
- return false;
- }
- }
-
- /**
- * 获取公平锁
- *
- * @param key
- * @param leaseTime 持有锁的时间
- * @param expireUnit 时间单位
- */
- public boolean getFairLock(String key, long leaseTime, TimeUnit expireUnit) {
- Assert.isTrue(leaseTime > 0, "保留锁的时间必须大于0");
- Assert.isTrue(Validator.isNotEmpty(expireUnit), "时间单位不能为空");
- RLock lock = getLock(key, FAIR_LOCK);
- try {
- return lock.tryLock(leaseTime, expireUnit);
- } catch (InterruptedException e) {
- e.printStackTrace();
- return false;
- }
- }
-
- /**
- * 释放锁(统一释放)
- */
- public void unLock(String key) {
- Integer lockType = threadLocal.get();
- RLock lock = getLock(key, lockType);
- lock.unlock();
- threadLocal.remove();
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
index 0d945be5..d5f54653 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
@@ -1,19 +1,25 @@
package com.ruoyi.common.enums;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
/**
* 数据源
- *
- * @author ruoyi
+ *
+ * @author Lion Li
*/
-public enum DataSourceType
-{
- /**
- * 主库
- */
- MASTER,
+@AllArgsConstructor
+public enum DataSourceType {
+ /**
+ * 主库
+ */
+ MASTER("master"),
- /**
- * 从库
- */
- SLAVE
+ /**
+ * 从库
+ */
+ SLAVE("slave");
+
+ @Getter
+ private final String source;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
index caacba63..74659bfd 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
@@ -1,75 +1,77 @@
-package com.ruoyi.common.filter;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import javax.servlet.ReadListener;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import com.ruoyi.common.utils.http.HttpHelper;
-
-/**
- * 构建可重复读取inputStream的request
- *
- * @author ruoyi
- */
-public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
-{
- private final byte[] body;
-
- public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
- {
- super(request);
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
-
- body = HttpHelper.getBodyString(request).getBytes("UTF-8");
- }
-
- @Override
- public BufferedReader getReader() throws IOException
- {
- return new BufferedReader(new InputStreamReader(getInputStream()));
- }
-
- @Override
- public ServletInputStream getInputStream() throws IOException
- {
- final ByteArrayInputStream bais = new ByteArrayInputStream(body);
- return new ServletInputStream()
- {
- @Override
- public int read() throws IOException
- {
- return bais.read();
- }
-
- @Override
- public int available() throws IOException
- {
- return body.length;
- }
-
- @Override
- public boolean isFinished()
- {
- return false;
- }
-
- @Override
- public boolean isReady()
- {
- return false;
- }
-
- @Override
- public void setReadListener(ReadListener readListener)
- {
-
- }
- };
- }
-}
+package com.ruoyi.common.filter;
+
+import cn.hutool.core.io.IoUtil;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 构建可重复读取inputStream的request
+ *
+ * @author ruoyi
+ */
+public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
+{
+ private final byte[] body;
+
+ public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
+ {
+ super(request);
+ request.setCharacterEncoding("UTF-8");
+ response.setCharacterEncoding("UTF-8");
+
+ body = IoUtil.readUtf8(request.getInputStream()).getBytes(StandardCharsets.UTF_8);
+ }
+
+ @Override
+ public BufferedReader getReader() throws IOException
+ {
+ return new BufferedReader(new InputStreamReader(getInputStream()));
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException
+ {
+ final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+ return new ServletInputStream()
+ {
+ @Override
+ public int read() throws IOException
+ {
+ return bais.read();
+ }
+
+ @Override
+ public int available() throws IOException
+ {
+ return body.length;
+ }
+
+ @Override
+ public boolean isFinished()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean isReady()
+ {
+ return false;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener)
+ {
+
+ }
+ };
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
index 0170e1d7..4d36a92e 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
@@ -1,9 +1,9 @@
package com.ruoyi.common.filter;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
-import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
/**
* XSS过滤处理
@@ -57,7 +58,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
}
// 为空,直接返回
- String json = IOUtils.toString(super.getInputStream(), "utf-8");
+ String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
if (Validator.isEmpty(json))
{
return super.getInputStream();
@@ -65,7 +66,8 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
// xss过滤
json = HtmlUtil.cleanHtmlTag(json).trim();
- final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8"));
+
+ final ByteArrayInputStream bis = IoUtil.toStream(json, StandardCharsets.UTF_8);
return new ServletInputStream()
{
@Override
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
new file mode 100644
index 00000000..ae6cc11b
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
@@ -0,0 +1,101 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * JSON 工具类
+ *
+ * @author 芋道源码
+ */
+public class JsonUtils {
+
+ private static ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * 初始化 objectMapper 属性
+ *
+ * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean
+ *
+ * @param objectMapper ObjectMapper 对象
+ */
+ public static void init(ObjectMapper objectMapper) {
+ JsonUtils.objectMapper = objectMapper;
+ }
+
+ public static String toJsonString(Object object) {
+ if (Validator.isEmpty(object)) {
+ return null;
+ }
+ try {
+ return objectMapper.writeValueAsString(object);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static T parseObject(String text, Class clazz) {
+ if (StrUtil.isEmpty(text)) {
+ return null;
+ }
+ try {
+ return objectMapper.readValue(text, clazz);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static T parseObject(byte[] bytes, Class clazz) {
+ if (ArrayUtil.isEmpty(bytes)) {
+ return null;
+ }
+ try {
+ return objectMapper.readValue(bytes, clazz);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static T parseObject(String text, TypeReference typeReference) {
+ if (StrUtil.isBlank(text)) {
+ return null;
+ }
+ try {
+ return objectMapper.readValue(text, typeReference);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Map parseMap(String text) {
+ if (StrUtil.isBlank(text)) {
+ return null;
+ }
+ try {
+ return objectMapper.readValue(text, new TypeReference