300 lines
14 KiB
Markdown
300 lines
14 KiB
Markdown
|
## JAVA常用工具类
|
|||
|
|
|||
|
#### HttpRequestUtil
|
|||
|
|
|||
|
##### 作用:对HttpReuquest对象进行操作的工具类
|
|||
|
|
|||
|
```java
|
|||
|
public class HttpRequestUtil {
|
|||
|
|
|||
|
/**
|
|||
|
* 获取请求IP地址
|
|||
|
*/
|
|||
|
public static String getIpAddr(HttpServletRequest request) throws IOException {
|
|||
|
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
|
|||
|
|
|||
|
String ip = request.getHeader("X-Forwarded-For");
|
|||
|
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
ip = request.getHeader("Proxy-Client-IP");
|
|||
|
}
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
ip = request.getHeader("WL-Proxy-Client-IP");
|
|||
|
}
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
ip = request.getHeader("HTTP_CLIENT_IP");
|
|||
|
}
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
|
|||
|
}
|
|||
|
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|||
|
ip = request.getRemoteAddr();
|
|||
|
}
|
|||
|
} else if (ip.length() > 15) {
|
|||
|
String[] ips = ip.split(",");
|
|||
|
for (int index = 0; index < ips.length; index++) {
|
|||
|
String strIp = (String) ips[index];
|
|||
|
if (!("unknown".equalsIgnoreCase(strIp))) {
|
|||
|
ip = strIp;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return ip;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取代理信息
|
|||
|
*/
|
|||
|
public static String getAgent(HttpServletRequest request){
|
|||
|
return request.getHeader("user-agent");
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### Base64ToMultipartFile
|
|||
|
|
|||
|
##### 作用:实现了MultipartFile接口 可以接受Base64编码后的文件
|
|||
|
|
|||
|
```java
|
|||
|
/**
|
|||
|
* @author dss
|
|||
|
* @since 2022/8/8
|
|||
|
*/
|
|||
|
public class Base64ToMultipartFile implements MultipartFile {
|
|||
|
private final byte[] fileContent;
|
|||
|
|
|||
|
private final String extension;
|
|||
|
private final String contentType;
|
|||
|
private final String name;
|
|||
|
|
|||
|
private final String id = "file_"+ UUID.randomUUID().toString();
|
|||
|
|
|||
|
|
|||
|
public Base64ToMultipartFile(String base64,String name) {
|
|||
|
if (base64==null) throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败");
|
|||
|
String[] split = base64.split(",");
|
|||
|
|
|||
|
if (split==null||split.length!=2) throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败");
|
|||
|
String uri = split[0];
|
|||
|
String data = split[1];
|
|||
|
try {
|
|||
|
this.fileContent = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8));
|
|||
|
}catch (IllegalArgumentException e){
|
|||
|
throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败");
|
|||
|
}
|
|||
|
this.extension = uri.split(";")[0].split("/")[1];
|
|||
|
this.contentType = uri.split(";")[0].split(":")[1];
|
|||
|
this.name=name;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @param base64
|
|||
|
* @param dataUri 格式类似于: data:image/png;base64
|
|||
|
* @param name
|
|||
|
*/
|
|||
|
public Base64ToMultipartFile(String base64, String dataUri, String name) {
|
|||
|
try {
|
|||
|
this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
|
|||
|
}catch (IllegalArgumentException e){
|
|||
|
throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败");
|
|||
|
}
|
|||
|
this.extension = dataUri.split(";")[0].split("/")[1];
|
|||
|
this.contentType = dataUri.split(";")[0].split(":")[1];
|
|||
|
this.name = name;
|
|||
|
}
|
|||
|
|
|||
|
public Base64ToMultipartFile(String base64, String extension, String contentType, String name) {
|
|||
|
try {
|
|||
|
this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
|
|||
|
}catch (IllegalArgumentException e){
|
|||
|
throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败");
|
|||
|
}
|
|||
|
this.extension = extension;
|
|||
|
this.contentType = contentType;
|
|||
|
this.name = name;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public String getName() {
|
|||
|
if (name==null){
|
|||
|
return id;
|
|||
|
}
|
|||
|
return name;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public String getOriginalFilename() {
|
|||
|
if (name==null){
|
|||
|
return id + "." + extension;
|
|||
|
}
|
|||
|
return name+"."+extension;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public String getContentType() {
|
|||
|
return contentType;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public boolean isEmpty() {
|
|||
|
return fileContent == null || fileContent.length == 0;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public long getSize() {
|
|||
|
return fileContent.length;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public byte[] getBytes() throws IOException {
|
|||
|
return fileContent;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public ByteArrayInputStream getInputStream() throws IOException {
|
|||
|
return new ByteArrayInputStream(fileContent);
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void transferTo(File file) throws IOException, IllegalStateException {
|
|||
|
try (FileOutputStream fos = new FileOutputStream(file)) {
|
|||
|
fos.write(fileContent);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 实列
|
|||
|
*/
|
|||
|
public static void main(String[] args) {
|
|||
|
StringBuilder s = new StringBuilder("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM0AAAByCAYAAADwIFXJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAA8jSURBVHhe7Z1bcty4DobPJr2ZeCnxCs55d3kbqTxnAZ49JH1IXCQABHTrltHK4K9ixS2RIKn+P5IWOeP/3Epp+vPnD/z769ev2+/fv+HnVf3zcXt9eb19/BN87vKudcH1t9vP9uPP7y+3l+/9J9bP29uLufbj7fbSrr396B8+bx/fXm6v759wK9Ln+yvFwHhYVghiYhsmifYO7YJ7Og7U8e2jtcjrx6zonn+9t9d5ZpPm/hc0iToLmsgss6GbwLzGJOqahWQLNJiHDQ7tIHNP8qCR1+x9+Kz70+NyO6K+dkm4pNwyPKBwfZDk8ylonkKPg4a/ZEzD6A6yIz9+thBMhurmUYZD08h6hrpcw3tgSmhMO0z/AJBv0vx6RngYNAyLuA75prYWNE+hM2Ya+KIdo3gG9vOiiQcghGkijfEcMNmcIumYsp7+c2+zAAX6O0PnAkDaD42EuQvbj8+hoHkKnbM8c4zaBEYRRpVJw8HQaMDWoeFyXrKzjzWn1rSMFID09vd2qiVmUwxN3N6C5sI663caMJYygPzypdAIngnHUXoFmggGaJ+oewM0Eyw9L7WNYWF4WCE0C/X4ZfozsgNFQfN0Ogsa/rKV4QIDqXtgNI6FMWZIlqAZ4Ztl7m2BBup+bb/LCEB6P9tSTS7NujwAsE/eIIGKQIPrYqDQnwuap9B50EjjLBm6Cco3M/z3f/ivhAIMrkfaeclFqZuKYkQmxbZQGzdBQ4ZV+ah+8zsK5jPJ5LGKoOlS8VScguYpdAiaUroKmkQVNNdUQZOoguaaKmgSVdBcUwVNogqaa6qgSVRBc00VNIkqaK6pgiZRBc01VdAk6iugWdwdp83Lxc1AziM2A7dtKDqboUEe95RBsGm7qKgMbb7KtvgnG0icP9gALWgSdT40ZMp+tN4zAADRj6tE5uzl8TjLAE1gKFBgOnUyAHQ+NP6gQUAHgwWUcY7ssAqaRJ0ODZioffH8L12eREdaPrpJPAh6uWasDwPJMjRkyOA+lJ3MejI08Dk63mPP1rGwTXz8yCtb0CTqEDR8dosMwcsN78uFERPMK0/rCqlYI1Td4N1UFpJFaNbMru7vhMb0+fX9Q/fLlMEZI156uvchBj4Lv58/C5pMHYemfZnyy6ZlljaqHin1CE9iaExeFJ407jF3QdNjLhhVt2sHNATM3EYsqwYMU6a3043NEoCw5oGmyXuurUxBk6jj0PiAKINMQJC8cjJP/1mYXZrHhaaDKxLXvTa667ZuhwbqtHEtSKrMQmyWqaPVYmZkZwnXnlNBk6i7lmf0keUaW5nMN8Aca55Z2HBsHje2+Cy1FRqMvRWaKJ8x+SFolgeW4TkWNLk6Dxo0k50NMFmTzJ+nGP26MMoeaMbR28jcD2PdDU0rtQKwvQ9tGZ4XpqmOgiZXpy3PArDQVNoAKh/cf7u9NfNIg+6ChtoS3YeywqihsVfABdn+GGiG+0p25jUATrL9qRcBqXrUiwAw3mT+JdOaewNcdN9AuQ+aJjKrzQPlBuCtebuca9Tv2dStrd/7XsoCNE34bCwMGD9+hlr2XkGTqLuWZwwPJPFlL46ubAAy1gAN3ffMbqGZ6uZkDccAruXrIhOL5LZf9bn3wcwODjQghtimqU9LA00TlWeIC5pEPfJ3mqtoBs4x924ZaHZJgOotDxdU0CTq3wjNY3UPNMdV0CSqoLlXBc2/ToegKaWroElUQXNNFTSJKmiuqYImUQXNNVXQJKqguaYKmkQdgibYqOM3SLA56e474Aae3nlfUbRZuCR4u/eIPRgpsafiJO6Tu+nKz8LtC8VVeUx5+6ay9a+gSdRxaGJT/p3Q+AJIRF/tyQWloS90CkA+K6e/CKIAp6DJ1V8JzVcJ4NR7NHugGWDo8vprrxU0ucqHhkZbXoo0wynjBXWh4eakNhfBzJ4ZRRmvfQQBplbnj6V+UrsNIFuhgWfkxfb6a68VNLnKhYaMJ/KimYTxhrrGMphHgGOhIRiGGUHGGPLw7zB+P7GdBsymTdC8j+2Z5DzbIWZBk6vHvQiYDbQZGscgExQRNGDu0ciqTgWNiTdJH39xzR7Uxf33TA9x1HOx/aXr7vNpcp7tUE9Bk6vMmSbKpwxs6gpjS1AUNNHZMNmWII/bT4IwMP2mmQaWfUE+UyfEs3UVNLk6AxptWqm/ABqIHfd9EzS9LMQRsxBrqBPbpvK1PAVNok6BJrzfDSCuu3ChSSJo/DIGJpVHgzpLguLngZhrBjbaDE0TxjewOs8O88k+13/unKpToGnylhXjNQNIE+RZgoYMruJAHmE+CxaN6tKcti0DIBRTXvP6ZAV5NkLThf219eo8LdfwnAqaRD3uRcA4Ak8AcHLNRIag1GP0clMs10QEzlTO3PdmIwJnSk5beOTH1MpD3RTHlreJ4g19hkQxFvtC1908c9sY/IImUYegOVVoIrVkyVIHZWVmyVJBk6hcaPoso2cEHKnNLPEF6iO5milpNl36/SVTBU2i0mcaMue0lEkc2e3S6ilmu0AFTaKeb3lW2qKCJlEFzTVV0CSqoLmmCppEFTTXVEGTqILmmipoEnUYGvPWa/+rWbtBSSnaTbda3GwcNwc3KdhYPCR6PuMbOOr3Wj/tW0VKtbn5BDoGjTmDFRpkSWiex+6DmHbt1SOhaYJX2PYV+tY6VvIVNIk6BI1zTAUMsnWWAD0emrs3Rh8MjRdv83MqaJ5Xh6CBL3SEZgYAR3z+k97T8kKZZR0ahIAT/dn0aPMT2uTMdnIZZ8uqJV7rj2dUswx8e5/zQPvcmHMMBckQfzx3N2kRms+CJlNHf6dRx076F6zMw2YYDTIbYxmawZBsXhcagtOO4NZ47fMHQ0XxZsicNhsAhjxwf2XGFXng0KUCaKx/+lzQPK+OQqNngZ6keSwgKDDNZHozC1EC0wyGQrkjexOeANbmBTmmZg3m7lKQBCCqPMbow+cuHhw+2r0ZAq9+Dyr9fLgvBU2qjkCDJpWjII3Akwk88zQpEy/MNIHZNXQkMpc/Y1G7hvtB+9ToviVPyyXNH0EK1+Xz8QcMSNw/U49WQZOq/dAEZleG+TpootlHiU07telx0Mi2urMXyMZa6DuroHlenQmNzaNNv2CcwDADIFBnZKxRs6n9uvUMutRPWScD0f+N2jICuAp7QfO8OvQ7zWAcNJhdnqk8YIKtoy3FM4C8fpPQ+WAqtTJRfcMSk9onrw15ep2tDdbMHYDX7719EQQjNFyfbH+vb8pT0Dyvjr4IQHC6ySipZQmbhOHBpExjTDyKwOHyLb6cqWCkFrFtwrrGGFIIBd9vs6Rj1C15PAC0HGi6zDNU5Qua59VhaBYVmOROSWjStGjmr1NBk6iCZqcKmlJBs1MFTekcaEpnq6BJVEFzTRU0iSporqmCJlEFzTVV0CSqoLmmCppE7YaGNvLkppxM8o0Zbwyqt2hU3n+zRpuRZhPSavEIynRawWxs2gR14Fu+eFPyDm3uJ/7stmHhTV1Bk6i7ZprF169khn70RUGwAMai0YQmMOizkA9UZMwTodncz4LmcjoNGrjHx074ICcKZyB9rSu6Pioye3R9wZgnals/j0BTf58mVWdBA8YQS6BxiWbL6ZEZz5ZJw2Ecdd+O4uEMFBnTtA3KtzrlmTCatdRZt2H2oLZRmurZ0M8j0PS2FDSJOgcaNAKbcVwyOUaBWBIuPWsAhDIGG5w+do31sPZAIw09w6BBiNvZ9fn+Qe3a0s+d0FC/C5pEnQKNNTR81vlcCKzhpzjdmLYeY3gy3/xZag80TjsVnDrW0A+j9X7ugEYAV9Ak6gxoxhF/HI1t2V7GMw7EamXHJRHd4+sQT888s/ZAo2OMUMhYC4ZnrfZzKzQ6X0GTqMdDg0bk9b1O0Yjdy4zwdTE0rqmEycHcDlioyJhfAM2Gfir4peTzhbbN
|
|||
|
|
|||
|
Base64ToMultipartFile base64ToMultipartFile = new Base64ToMultipartFile(s.toString(),null);
|
|||
|
|
|||
|
System.out.println(base64ToMultipartFile.getOriginalFilename());
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### SpringContextUtil
|
|||
|
|
|||
|
##### 作用:使用静态方法从Spring容器中获取Bean对象
|
|||
|
|
|||
|
```java
|
|||
|
@Component
|
|||
|
public class SpringContextUtil implements ApplicationContextAware {
|
|||
|
private static ApplicationContext applicationContext;
|
|||
|
|
|||
|
@Override
|
|||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|||
|
SpringContextUtil.applicationContext = applicationContext;
|
|||
|
}
|
|||
|
|
|||
|
//获取applicationContext
|
|||
|
public static ApplicationContext getApplicationContext() {
|
|||
|
return applicationContext;
|
|||
|
}
|
|||
|
|
|||
|
//通过name获取 Bean.
|
|||
|
public static Object getBean(String name) {
|
|||
|
return getApplicationContext().getBean(name);
|
|||
|
}
|
|||
|
|
|||
|
//通过class获取Bean.
|
|||
|
public static <T> T getBean(Class<T> clazz) {
|
|||
|
return getApplicationContext().getBean(clazz);
|
|||
|
}
|
|||
|
|
|||
|
//通过name,以及Clazz返回指定的Bean
|
|||
|
public static <T> T getBean(String name, Class<T> clazz) {
|
|||
|
return getApplicationContext().getBean(name, clazz);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### TransactionUtil
|
|||
|
|
|||
|
##### 作用:手动事务控制
|
|||
|
|
|||
|
```java
|
|||
|
@Component
|
|||
|
@Scope("prototype")
|
|||
|
public class TransactionUtils {
|
|||
|
private TransactionStatus status;
|
|||
|
|
|||
|
private final DataSourceTransactionManager dataSourceTransactionManager;
|
|||
|
|
|||
|
public TransactionUtils(DataSourceTransactionManager dataSourceTransactionManager){
|
|||
|
|
|||
|
this.dataSourceTransactionManager = dataSourceTransactionManager;
|
|||
|
}
|
|||
|
|
|||
|
//开始事务
|
|||
|
public TransactionStatus begin() {
|
|||
|
|
|||
|
status = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
|
|||
|
return status;
|
|||
|
}
|
|||
|
//提交事务
|
|||
|
public void commit(TransactionStatus transaction) {
|
|||
|
dataSourceTransactionManager.commit(transaction);
|
|||
|
}
|
|||
|
//回滚事务
|
|||
|
public void rollback() {
|
|||
|
dataSourceTransactionManager.rollback(status);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### ReflectionUtils
|
|||
|
|
|||
|
##### 作用:通过反射获取某个类的所有属性
|
|||
|
|
|||
|
```java
|
|||
|
public class ReflectionUtils {
|
|||
|
|
|||
|
/**
|
|||
|
* 获取某个一个类所有的属性(包括所有父类)
|
|||
|
* @param clazz 目标类
|
|||
|
* @return 所有属性集合
|
|||
|
*/
|
|||
|
public static <T> List<Field> reflectForField(Class<T> clazz) {
|
|||
|
Class tmpClazz = clazz;
|
|||
|
List<Field> fieldList = new ArrayList<>();
|
|||
|
while (tmpClazz != null) {
|
|||
|
if (tmpClazz.equals(Object.class)) {
|
|||
|
tmpClazz = tmpClazz.getSuperclass();
|
|||
|
continue;
|
|||
|
}
|
|||
|
fieldList.addAll(new ArrayList<>(Arrays.asList(tmpClazz.getDeclaredFields())));
|
|||
|
tmpClazz = tmpClazz.getSuperclass();
|
|||
|
}
|
|||
|
return fieldList;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取某个类的某个属性(包括父类)
|
|||
|
* @param clazz 目标类
|
|||
|
* @param filedName 属性名称
|
|||
|
* @return 属性
|
|||
|
*/
|
|||
|
public static<T> Field getDeclaredField(Class<T> clazz,String filedName){
|
|||
|
List<Field> fieldList = reflectForField(clazz);
|
|||
|
|
|||
|
for (int i = 0; i < fieldList.size(); i++) {
|
|||
|
if (fieldList.get(i).getName().equals(filedName)){
|
|||
|
return fieldList.get(i);
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|