# 修改匿名注解,支持注解组合 (#394)

* # 修改匿名注解,支持注解组合

* # 注解完善

* # 以后日志记录IP 获取 支持,在线与离线方式
pull/403/head
廖金龙 2020-06-09 20:36:59 +08:00 committed by GitHub
parent 66eeb7c76d
commit f8028c8310
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 748 additions and 77 deletions

View File

@ -15,16 +15,15 @@
*/ */
package me.zhengjie.annotation; package me.zhengjie.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** /**
* @author jacky * @author jacky
* 访 * 访
*/ */
@Target(ElementType.METHOD) @Inherited
@Documented
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface AnonymousAccess { public @interface AnonymousAccess {

View File

@ -0,0 +1,91 @@
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.annotation.rest;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import me.zhengjie.annotation.AnonymousAccess;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Annotation for mapping HTTP {@code DELETE} requests onto specific handler
* methods.
* 访 DeleteMapping
*
* @author liaojinlong
* @see AnonymousGetMapping
* @see AnonymousPostMapping
* @see AnonymousPutMapping
* @see AnonymousPatchMapping
* @see RequestMapping
*/
@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.DELETE)
public @interface AnonymousDeleteMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
/**
* Alias for {@link RequestMapping#params}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
/**
* Alias for {@link RequestMapping#headers}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
/**
* Alias for {@link RequestMapping#consumes}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
/**
* Alias for {@link RequestMapping#produces}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}

View File

@ -0,0 +1,90 @@
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.annotation.rest;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import me.zhengjie.annotation.AnonymousAccess;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Annotation for mapping HTTP {@code GET} requests onto specific handler
* methods.
* <p>
* 访 GetMapping
*
* @author liaojinlong
* @see RequestMapping
*/
@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface AnonymousGetMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
/**
* Alias for {@link RequestMapping#params}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
/**
* Alias for {@link RequestMapping#headers}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
/**
* Alias for {@link RequestMapping#consumes}.
*
* @since 4.3.5
*/
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
/**
* Alias for {@link RequestMapping#produces}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}

View File

@ -0,0 +1,91 @@
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.annotation.rest;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import me.zhengjie.annotation.AnonymousAccess;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Annotation for mapping HTTP {@code PATCH} requests onto specific handler
* methods.
* * 访 PatchMapping
*
* @author liaojinlong
* @see AnonymousGetMapping
* @see AnonymousPostMapping
* @see AnonymousPutMapping
* @see AnonymousDeleteMapping
* @see RequestMapping
*/
@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.PATCH)
public @interface AnonymousPatchMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
/**
* Alias for {@link RequestMapping#params}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
/**
* Alias for {@link RequestMapping#headers}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
/**
* Alias for {@link RequestMapping#consumes}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
/**
* Alias for {@link RequestMapping#produces}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}

View File

@ -0,0 +1,91 @@
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.annotation.rest;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import me.zhengjie.annotation.AnonymousAccess;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Annotation for mapping HTTP {@code POST} requests onto specific handler
* methods.
* 访 PostMapping
*
* @author liaojinlong
* @see AnonymousGetMapping
* @see AnonymousPostMapping
* @see AnonymousPutMapping
* @see AnonymousDeleteMapping
* @see RequestMapping
*/
@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface AnonymousPostMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
/**
* Alias for {@link RequestMapping#params}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
/**
* Alias for {@link RequestMapping#headers}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
/**
* Alias for {@link RequestMapping#consumes}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
/**
* Alias for {@link RequestMapping#produces}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}

View File

@ -0,0 +1,91 @@
/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.annotation.rest;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import me.zhengjie.annotation.AnonymousAccess;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Annotation for mapping HTTP {@code PUT} requests onto specific handler
* methods.
* * 访 PutMapping
*
* @author liaojinlong
* @see AnonymousGetMapping
* @see AnonymousPostMapping
* @see AnonymousPutMapping
* @see AnonymousDeleteMapping
* @see RequestMapping
*/
@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.PUT)
public @interface AnonymousPutMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
/**
* Alias for {@link RequestMapping#params}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
/**
* Alias for {@link RequestMapping#headers}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
/**
* Alias for {@link RequestMapping#consumes}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
/**
* Alias for {@link RequestMapping#produces}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}

View File

@ -0,0 +1,46 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.utils;
import java.io.IOException;
/**
* @author: liaojinlong
* @date: 2020/6/9 17:02
* @since: 1.0
* @see {@link SpringContextHolder}
* SpringContextHolder <br>
* <br>
* SpringContextHolder 使
*/
public interface CallBack {
/**
*
*/
void executor();
/**
*
*
* @return
*/
default String getCallBackName() {
return Thread.currentThread().getId() + ":" + this.getClass().getName();
}
}

View File

@ -17,11 +17,16 @@ package me.zhengjie.utils;
/** /**
* *
*
* @author Zheng Jie * @author Zheng Jie
* @date 2018-12-26 * @date 2018-12-26
*/ */
public class ElAdminConstant { public class ElAdminConstant {
/**
* IP
*/
public static final String REGION = "内网IP|内网IP";
/** /**
* win * win
*/ */
@ -35,7 +40,7 @@ public class ElAdminConstant {
/** /**
* *
*/ */
public static class Url{ public static class Url {
// 免费图床 // 免费图床
public static final String SM_MS_URL = "https://sm.ms/api"; public static final String SM_MS_URL = "https://sm.ms/api";
// IP归属地查询 // IP归属地查询

View File

@ -22,6 +22,7 @@ import cn.hutool.poi.excel.ExcelUtil;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -35,6 +36,7 @@ import java.util.Map;
/** /**
* File hutool * File hutool
*
* @author Zheng Jie * @author Zheng Jie
* @date 2018-12-27 * @date 2018-12-27
*/ */
@ -61,11 +63,11 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
/** /**
* MultipartFileFile * MultipartFileFile
*/ */
public static File toFile(MultipartFile multipartFile){ public static File toFile(MultipartFile multipartFile) {
// 获取文件名 // 获取文件名
String fileName = multipartFile.getOriginalFilename(); String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀 // 获取文件后缀
String prefix="."+getExtensionName(fileName); String prefix = "." + getExtensionName(fileName);
File file = null; File file = null;
try { try {
// 用uuid作为文件名防止生成的临时文件重复 // 用uuid作为文件名防止生成的临时文件重复
@ -84,7 +86,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
public static String getExtensionName(String filename) { public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) { if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.'); int dot = filename.lastIndexOf('.');
if ((dot >-1) && (dot < (filename.length() - 1))) { if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1); return filename.substring(dot + 1);
} }
} }
@ -97,7 +99,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
public static String getFileNameNoEx(String filename) { public static String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() > 0)) { if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.'); int dot = filename.lastIndexOf('.');
if ((dot >-1) && (dot < (filename.length()))) { if ((dot > -1) && (dot < (filename.length()))) {
return filename.substring(0, dot); return filename.substring(0, dot);
} }
} }
@ -107,7 +109,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
/** /**
* *
*/ */
public static String getSize(long size){ public static String getSize(long size) {
String resultSize; String resultSize;
if (size / GB >= 1) { if (size / GB >= 1) {
//如果当前Byte的值大于等于1GB //如果当前Byte的值大于等于1GB
@ -124,6 +126,26 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
return resultSize; return resultSize;
} }
/**
* inputStream File
*/
static File inputStreamToFile(InputStream ins, String name) throws Exception {
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
if (file.exists()) {
return file;
}
OutputStream os = new FileOutputStream(file);
int bytesRead;
int len = 8192;
byte[] buffer = new byte[len];
while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
return file;
}
/** /**
* *
*/ */
@ -157,16 +179,16 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
* excel * excel
*/ */
public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException { public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
String tempPath =System.getProperty("java.io.tmpdir") + IdUtil.fastSimpleUUID() + ".xlsx"; String tempPath = System.getProperty("java.io.tmpdir") + IdUtil.fastSimpleUUID() + ".xlsx";
File file = new File(tempPath); File file = new File(tempPath);
BigExcelWriter writer= ExcelUtil.getBigWriter(file); BigExcelWriter writer = ExcelUtil.getBigWriter(file);
// 一次性写出内容,使用默认样式,强制输出标题 // 一次性写出内容,使用默认样式,强制输出标题
writer.write(list, true); writer.write(list, true);
//response为HttpServletResponse对象 //response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//test.xls是弹出下载对话框的文件名不能为中文中文请自行编码 //test.xls是弹出下载对话框的文件名不能为中文中文请自行编码
response.setHeader("Content-Disposition","attachment;filename=file.xlsx"); response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
ServletOutputStream out=response.getOutputStream(); ServletOutputStream out = response.getOutputStream();
// 终止后删除临时文件 // 终止后删除临时文件
file.deleteOnExit(); file.deleteOnExit();
writer.flush(out, true); writer.flush(out, true);
@ -179,13 +201,13 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
String music = "mp3 wav wma mpa ram ra aac aif m4a"; String music = "mp3 wav wma mpa ram ra aac aif m4a";
String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg"; String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg";
String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg"; String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";
if(image.contains(type)){ if (image.contains(type)) {
return "图片"; return "图片";
} else if(documents.contains(type)){ } else if (documents.contains(type)) {
return "文档"; return "文档";
} else if(music.contains(type)){ } else if (music.contains(type)) {
return "音乐"; return "音乐";
} else if(video.contains(type)){ } else if (video.contains(type)) {
return "视频"; return "视频";
} else { } else {
return "其他"; return "其他";
@ -195,7 +217,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
public static void checkSize(long maxSize, long size) { public static void checkSize(long maxSize, long size) {
// 1M // 1M
int len = 1024 * 1024; int len = 1024 * 1024;
if(size > (maxSize * len)){ if (size > (maxSize * len)) {
throw new BadRequestException("文件超出规定大小"); throw new BadRequestException("文件超出规定大小");
} }
} }
@ -257,18 +279,19 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
/** /**
* *
* @param request / *
* @param request /
* @param response / * @param response /
* @param file / * @param file /
*/ */
public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit){ public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) {
response.setCharacterEncoding(request.getCharacterEncoding()); response.setCharacterEncoding(request.getCharacterEncoding());
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
FileInputStream fis = null; FileInputStream fis = null;
try { try {
fis = new FileInputStream(file); fis = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment; filename="+file.getName()); response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
IOUtils.copy(fis,response.getOutputStream()); IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer(); response.flushBuffer();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -276,7 +299,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
if (fis != null) { if (fis != null) {
try { try {
fis.close(); fis.close();
if(deleteOnExit){ if (deleteOnExit) {
file.deleteOnExit(); file.deleteOnExit();
} }
} catch (IOException e) { } catch (IOException e) {

View File

@ -20,6 +20,10 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import java.util.ArrayList;
import java.util.List;
/** /**
* @author Jie * @author Jie
@ -29,6 +33,23 @@ import org.springframework.context.ApplicationContextAware;
public class SpringContextHolder implements ApplicationContextAware, DisposableBean { public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null; private static ApplicationContext applicationContext = null;
private static List<CallBack> callBacks = new ArrayList<>();
private static boolean addCallback = true;
/**
* SpringContextHolder
* SpringContextHolder 使
*
* @param callBack
*/
public synchronized static void addCallBacks(CallBack callBack) {
if (addCallback) {
SpringContextHolder.callBacks.add(callBack);
} else {
log.warn("CallBack{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor();
}
}
/** /**
* applicationContextBean, . * applicationContextBean, .
@ -47,6 +68,44 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
return applicationContext.getBean(requiredType); return applicationContext.getBean(requiredType);
} }
/**
* SpringBoot
*
* @param property key
* @param defaultValue
* @param requiredType
* @return
*/
public static <T> T getProperties(String property, T defaultValue, Class<T> requiredType) {
T result = defaultValue;
try {
result = getBean(Environment.class).getProperty(property, requiredType);
} catch (Exception e) {
}
return result;
}
/**
* SpringBoot
*
* @param property key
* @return
*/
public static String getProperties(String property) {
return getProperties(property, null, String.class);
}
/**
* SpringBoot
*
* @param property key
* @param requiredType
* @return
*/
public static <T> T getProperties(String property, Class<T> requiredType) {
return getProperties(property, null, requiredType);
}
/** /**
* ApplicationContext. * ApplicationContext.
*/ */
@ -67,7 +126,7 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
} }
@Override @Override
public void destroy(){ public void destroy() {
SpringContextHolder.clearHolder(); SpringContextHolder.clearHolder();
} }
@ -77,5 +136,12 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext); log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
} }
SpringContextHolder.applicationContext = applicationContext; SpringContextHolder.applicationContext = applicationContext;
if (addCallback) {
for (CallBack callBack : SpringContextHolder.callBacks) {
callBack.executor();
}
callBacks.clear();
}
SpringContextHolder.addCallback = false;
} }
} }

View File

@ -20,7 +20,18 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import eu.bitwalker.useragentutils.Browser; import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.UserAgent; import eu.bitwalker.useragentutils.UserAgent;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbMakerConfigException;
import org.lionsoul.ip2region.DbSearcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Calendar; import java.util.Calendar;
@ -31,6 +42,34 @@ import java.util.Date;
* , org.apache.commons.lang3.StringUtils * , org.apache.commons.lang3.StringUtils
*/ */
public class StringUtils extends org.apache.commons.lang3.StringUtils { public class StringUtils extends org.apache.commons.lang3.StringUtils {
private static final Logger log = LoggerFactory.getLogger(StringUtils.class);
private static boolean ipLocal = false;
private static DbSearcher searcher = null;
static {
SpringContextHolder.addCallBacks(() -> {
StringUtils.ipLocal = SpringContextHolder.getProperties("ip.local-parsing", false, Boolean.class);
if (ipLocal) {
/**
*
*/
String path = "ip2region/ip2region.db";
String name = "ip2region.db";
DbConfig config = null;
try {
config = new DbConfig();
File file = FileUtil.inputStreamToFile(new ClassPathResource(path).getInputStream(), name);
searcher = new DbSearcher(config, file.getPath());
} catch (DbMakerConfigException | FileNotFoundException e) {
log.error(e.getMessage(), e);
} catch (NoSuchMethodException e) {
log.error(e.getMessage(), e);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
}
private static final char SEPARATOR = '_'; private static final char SEPARATOR = '_';
@ -140,12 +179,12 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
if (ip.contains(comma)) { if (ip.contains(comma)) {
ip = ip.split(",")[0]; ip = ip.split(",")[0];
} }
if (localhost.equals(ip)) { if (localhost.equals(ip)) {
// 获取本机真正的ip地址 // 获取本机真正的ip地址
try { try {
ip = InetAddress.getLocalHost().getHostAddress(); ip = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
} }
return ip; return ip;
@ -155,12 +194,42 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
* ip * ip
*/ */
public static String getCityInfo(String ip) { public static String getCityInfo(String ip) {
String api = String.format(ElAdminConstant.Url.IP_URL,ip); if (ipLocal) {
return getLocalCityInfo(ip);
} else {
return getHttpCityInfo(ip);
}
}
/**
* ip
*/
public static String getHttpCityInfo(String ip) {
String api = String.format(ElAdminConstant.Url.IP_URL, ip);
JSONObject object = JSONUtil.parseObj(HttpUtil.get(api)); JSONObject object = JSONUtil.parseObj(HttpUtil.get(api));
return object.get("addr", String.class); return object.get("addr", String.class);
} }
public static String getBrowser(HttpServletRequest request){ /**
* ip
*/
public static String getLocalCityInfo(String ip) {
try {
DataBlock dataBlock;
dataBlock = searcher.binarySearch(ip);
String address = dataBlock.getRegion().replace("0|", "");
char symbol = '|';
if (address.charAt(address.length() - 1) == symbol) {
address = address.substring(0, address.length() - 1);
}
return address.equals(ElAdminConstant.REGION) ? "内网IP" : address;
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return "";
}
public static String getBrowser(HttpServletRequest request) {
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser(); Browser browser = userAgent.getBrowser();
return browser.getName(); return browser.getName();
@ -169,13 +238,13 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
/** /**
* *
*/ */
public static String getWeekDay(){ public static String getWeekDay() {
String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTime(new Date()); cal.setTime(new Date());
int w = cal.get(Calendar.DAY_OF_WEEK) - 1; int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0){ if (w < 0) {
w = 0; w = 0;
} }
return weekDays[w]; return weekDays[w];
@ -183,9 +252,10 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
/** /**
* IP * IP
*
* @return / * @return /
*/ */
public static String getLocalIp(){ public static String getLocalIp() {
InetAddress addr; InetAddress addr;
try { try {
addr = InetAddress.getLocalHost(); addr = InetAddress.getLocalHost();

View File

@ -16,7 +16,7 @@
package me.zhengjie; package me.zhengjie;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import me.zhengjie.annotation.AnonymousAccess; import me.zhengjie.annotation.rest.AnonymousGetMapping;
import me.zhengjie.utils.SpringContextHolder; import me.zhengjie.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -26,11 +26,11 @@ import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
* -> @EnableJpaAuditing * -> @EnableJpaAuditing
*
* @author Zheng Jie * @author Zheng Jie
* @date 2018/11/15 9:20:19 * @date 2018/11/15 9:20:19
*/ */
@ -60,10 +60,10 @@ public class AppRun {
/** /**
* 访 * 访
*
* @return / * @return /
*/ */
@GetMapping("/") @AnonymousGetMapping("/")
@AnonymousAccess
public String index() { public String index() {
return "Backend service started successfully"; return "Backend service started successfully";
} }

View File

@ -21,8 +21,10 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Log; import me.zhengjie.annotation.Log;
import me.zhengjie.annotation.rest.AnonymousDeleteMapping;
import me.zhengjie.annotation.rest.AnonymousGetMapping;
import me.zhengjie.annotation.rest.AnonymousPostMapping;
import me.zhengjie.config.RsaProperties; import me.zhengjie.config.RsaProperties;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.security.config.SecurityProperties; import me.zhengjie.modules.security.config.SecurityProperties;
@ -43,6 +45,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -72,8 +75,7 @@ public class AuthorizationController {
@Log("用户登录") @Log("用户登录")
@ApiOperation("登录授权") @ApiOperation("登录授权")
@AnonymousAccess @AnonymousPostMapping(value = "/login")
@PostMapping(value = "/login")
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
// 密码解密 // 密码解密
String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
@ -98,27 +100,26 @@ public class AuthorizationController {
// 保存在线信息 // 保存在线信息
onlineUserService.save(jwtUserDto, token, request); onlineUserService.save(jwtUserDto, token, request);
// 返回 token 与 用户信息 // 返回 token 与 用户信息
Map<String,Object> authInfo = new HashMap<String,Object>(2){{ Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
put("token", properties.getTokenStartWith() + token); put("token", properties.getTokenStartWith() + token);
put("user", jwtUserDto); put("user", jwtUserDto);
}}; }};
if(singleLogin){ if (singleLogin) {
//踢掉之前已经登录的token //踢掉之前已经登录的token
onlineUserService.checkLoginOnUser(authUser.getUsername(),token); onlineUserService.checkLoginOnUser(authUser.getUsername(), token);
} }
return ResponseEntity.ok(authInfo); return ResponseEntity.ok(authInfo);
} }
@ApiOperation("获取用户信息") @ApiOperation("获取用户信息")
@GetMapping(value = "/info") @GetMapping(value = "/info")
public ResponseEntity<Object> getUserInfo(){ public ResponseEntity<Object> getUserInfo() {
return ResponseEntity.ok(SecurityUtils.getCurrentUser()); return ResponseEntity.ok(SecurityUtils.getCurrentUser());
} }
@AnonymousAccess
@ApiOperation("获取验证码") @ApiOperation("获取验证码")
@GetMapping(value = "/code") @AnonymousGetMapping(value = "/code")
public ResponseEntity<Object> getCode(){ public ResponseEntity<Object> getCode() {
// 算术类型 https://gitee.com/whvse/EasyCaptcha // 算术类型 https://gitee.com/whvse/EasyCaptcha
ArithmeticCaptcha captcha = new ArithmeticCaptcha(111, 36); ArithmeticCaptcha captcha = new ArithmeticCaptcha(111, 36);
// 几位数运算,默认是两位 // 几位数运算,默认是两位
@ -129,7 +130,7 @@ public class AuthorizationController {
// 保存 // 保存
redisUtils.set(uuid, result, expiration, TimeUnit.MINUTES); redisUtils.set(uuid, result, expiration, TimeUnit.MINUTES);
// 验证码信息 // 验证码信息
Map<String,Object> imgResult = new HashMap<String,Object>(2){{ Map<String, Object> imgResult = new HashMap<String, Object>(2) {{
put("img", captcha.toBase64()); put("img", captcha.toBase64());
put("uuid", uuid); put("uuid", uuid);
}}; }};
@ -137,9 +138,8 @@ public class AuthorizationController {
} }
@ApiOperation("退出登录") @ApiOperation("退出登录")
@AnonymousAccess @AnonymousDeleteMapping(value = "/logout")
@DeleteMapping(value = "/logout") public ResponseEntity<Object> logout(HttpServletRequest request) {
public ResponseEntity<Object> logout(HttpServletRequest request){
onlineUserService.logout(tokenProvider.getToken(request)); onlineUserService.logout(tokenProvider.getToken(request));
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }

View File

@ -17,11 +17,11 @@ package me.zhengjie.modules.system.rest;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Limit; import me.zhengjie.annotation.Limit;
import org.springframework.web.bind.annotation.GetMapping; import me.zhengjie.annotation.rest.AnonymousGetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
/** /**
@ -38,8 +38,7 @@ public class LimitController {
/** /**
* 60访 10redis limit_test * 60访 10redis limit_test
*/ */
@GetMapping @AnonymousGetMapping
@AnonymousAccess
@ApiOperation("测试") @ApiOperation("测试")
@Limit(key = "test", period = 60, count = 10, name = "testLimit", prefix = "limit") @Limit(key = "test", period = 60, count = 10, name = "testLimit", prefix = "limit")
public int test() { public int test() {

View File

@ -73,6 +73,11 @@ generator:
#是否开启 swagger-ui #是否开启 swagger-ui
swagger: swagger:
enabled: true enabled: true
# IP 本地解析
ip:
local-parsing: true
# 文件存储路径 # 文件存储路径
file: file:
@ -87,4 +92,4 @@ file:
avatar: C:\eladmin\avatar\ avatar: C:\eladmin\avatar\
# 文件大小 /M # 文件大小 /M
maxSize: 100 maxSize: 100
avatarMaxSize: 5 avatarMaxSize: 5

View File

@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.AnonymousAccess; import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Log; import me.zhengjie.annotation.Log;
import me.zhengjie.annotation.rest.AnonymousGetMapping;
import me.zhengjie.domain.vo.TradeVo; import me.zhengjie.domain.vo.TradeVo;
import me.zhengjie.domain.AlipayConfig; import me.zhengjie.domain.AlipayConfig;
import me.zhengjie.utils.AliPayStatusEnum; import me.zhengjie.utils.AliPayStatusEnum;
@ -31,6 +32,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore; import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -51,14 +53,14 @@ public class AliPayController {
private final AliPayService alipayService; private final AliPayService alipayService;
@GetMapping @GetMapping
public ResponseEntity<AlipayConfig> queryConfig(){ public ResponseEntity<AlipayConfig> queryConfig() {
return new ResponseEntity<>(alipayService.find(),HttpStatus.OK); return new ResponseEntity<>(alipayService.find(), HttpStatus.OK);
} }
@Log("配置支付宝") @Log("配置支付宝")
@ApiOperation("配置支付宝") @ApiOperation("配置支付宝")
@PutMapping @PutMapping
public ResponseEntity<Object> updateConfig(@Validated @RequestBody AlipayConfig alipayConfig){ public ResponseEntity<Object> updateConfig(@Validated @RequestBody AlipayConfig alipayConfig) {
alipayService.config(alipayConfig); alipayService.config(alipayConfig);
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ -66,41 +68,40 @@ public class AliPayController {
@Log("支付宝PC网页支付") @Log("支付宝PC网页支付")
@ApiOperation("PC网页支付") @ApiOperation("PC网页支付")
@PostMapping(value = "/toPayAsPC") @PostMapping(value = "/toPayAsPC")
public ResponseEntity<String> toPayAsPc(@Validated@RequestBody TradeVo trade) throws Exception{ public ResponseEntity<String> toPayAsPc(@Validated @RequestBody TradeVo trade) throws Exception {
AlipayConfig aliPay = alipayService.find(); AlipayConfig aliPay = alipayService.find();
trade.setOutTradeNo(alipayUtils.getOrderCode()); trade.setOutTradeNo(alipayUtils.getOrderCode());
String payUrl = alipayService.toPayAsPc(aliPay,trade); String payUrl = alipayService.toPayAsPc(aliPay, trade);
return ResponseEntity.ok(payUrl); return ResponseEntity.ok(payUrl);
} }
@Log("支付宝手机网页支付") @Log("支付宝手机网页支付")
@ApiOperation("手机网页支付") @ApiOperation("手机网页支付")
@PostMapping(value = "/toPayAsWeb") @PostMapping(value = "/toPayAsWeb")
public ResponseEntity<String> toPayAsWeb(@Validated @RequestBody TradeVo trade) throws Exception{ public ResponseEntity<String> toPayAsWeb(@Validated @RequestBody TradeVo trade) throws Exception {
AlipayConfig alipay = alipayService.find(); AlipayConfig alipay = alipayService.find();
trade.setOutTradeNo(alipayUtils.getOrderCode()); trade.setOutTradeNo(alipayUtils.getOrderCode());
String payUrl = alipayService.toPayAsWeb(alipay,trade); String payUrl = alipayService.toPayAsWeb(alipay, trade);
return ResponseEntity.ok(payUrl); return ResponseEntity.ok(payUrl);
} }
@ApiIgnore @ApiIgnore
@GetMapping("/return") @AnonymousGetMapping("/return")
@AnonymousAccess
@ApiOperation("支付之后跳转的链接") @ApiOperation("支付之后跳转的链接")
public ResponseEntity<String> returnPage(HttpServletRequest request, HttpServletResponse response){ public ResponseEntity<String> returnPage(HttpServletRequest request, HttpServletResponse response) {
AlipayConfig alipay = alipayService.find(); AlipayConfig alipay = alipayService.find();
response.setContentType("text/html;charset=" + alipay.getCharset()); response.setContentType("text/html;charset=" + alipay.getCharset());
//内容验签,防止黑客篡改参数 //内容验签,防止黑客篡改参数
if(alipayUtils.rsaCheck(request,alipay)){ if (alipayUtils.rsaCheck(request, alipay)) {
//商户订单号 //商户订单号
String outTradeNo = new String(request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); String outTradeNo = new String(request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
//支付宝交易号 //支付宝交易号
String tradeNo = new String(request.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); String tradeNo = new String(request.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("商户订单号"+outTradeNo+" "+"第三方交易号"+tradeNo); System.out.println("商户订单号" + outTradeNo + " " + "第三方交易号" + tradeNo);
// 根据业务需要返回数据这里统一返回OK // 根据业务需要返回数据这里统一返回OK
return new ResponseEntity<>("payment successful",HttpStatus.OK); return new ResponseEntity<>("payment successful", HttpStatus.OK);
}else{ } else {
// 根据业务需要返回数据 // 根据业务需要返回数据
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
} }
@ -109,13 +110,12 @@ public class AliPayController {
@ApiIgnore @ApiIgnore
@RequestMapping("/notify") @RequestMapping("/notify")
@AnonymousAccess @AnonymousAccess
@SuppressWarnings("all")
@ApiOperation("支付异步通知(要公网访问)接收异步通知检查通知内容app_id、out_trade_no、total_amount是否与请求中的一致根据trade_status进行后续业务处理") @ApiOperation("支付异步通知(要公网访问)接收异步通知检查通知内容app_id、out_trade_no、total_amount是否与请求中的一致根据trade_status进行后续业务处理")
public ResponseEntity<Object> notify(HttpServletRequest request){ public ResponseEntity<Object> notify(HttpServletRequest request) {
AlipayConfig alipay = alipayService.find(); AlipayConfig alipay = alipayService.find();
Map<String, String[]> parameterMap = request.getParameterMap(); Map<String, String[]> parameterMap = request.getParameterMap();
//内容验签,防止黑客篡改参数 //内容验签,防止黑客篡改参数
if (alipayUtils.rsaCheck(request,alipay)) { if (alipayUtils.rsaCheck(request, alipay)) {
//交易状态 //交易状态
String tradeStatus = new String(request.getParameter("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); String tradeStatus = new String(request.getParameter("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
// 商户订单号 // 商户订单号
@ -125,8 +125,8 @@ public class AliPayController {
//付款金额 //付款金额
String totalAmount = new String(request.getParameter("total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); String totalAmount = new String(request.getParameter("total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
//验证 //验证
if(tradeStatus.equals(AliPayStatusEnum.SUCCESS.getValue())||tradeStatus.equals(AliPayStatusEnum.FINISHED.getValue())){ if (tradeStatus.equals(AliPayStatusEnum.SUCCESS.getValue()) || tradeStatus.equals(AliPayStatusEnum.FINISHED.getValue())) {
// 验证通过后应该根据业务需要处理订单 // 验证通过后应该根据业务需要处理订单
} }
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }

View File

@ -139,7 +139,11 @@
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version> <version>${druid.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
<!--lombok插件--> <!--lombok插件-->
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>