mirror of https://github.com/jeecgboot/jeecg-boot
【v3.8.3】功能性能优化
parent
f087525a75
commit
a6751c22be
|
@ -13,7 +13,10 @@ import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
import org.springframework.util.FileCopyUtils;
|
import org.springframework.util.FileCopyUtils;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||||
import org.springframework.web.servlet.HandlerMapping;
|
import org.springframework.web.servlet.HandlerMapping;
|
||||||
|
@ -213,9 +216,7 @@ public class CommonController {
|
||||||
if(oConvertUtils.isEmpty(imgPath) || CommonConstant.STRING_NULL.equals(imgPath)){
|
if(oConvertUtils.isEmpty(imgPath) || CommonConstant.STRING_NULL.equals(imgPath)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 其余处理略
|
|
||||||
InputStream inputStream = null;
|
|
||||||
OutputStream outputStream = null;
|
|
||||||
try {
|
try {
|
||||||
imgPath = imgPath.replace("..", "").replace("../","");
|
imgPath = imgPath.replace("..", "").replace("../","");
|
||||||
if (imgPath.endsWith(SymbolConstant.COMMA)) {
|
if (imgPath.endsWith(SymbolConstant.COMMA)) {
|
||||||
|
@ -236,33 +237,21 @@ public class CommonController {
|
||||||
// 设置强制下载不打开
|
// 设置强制下载不打开
|
||||||
response.setContentType("application/force-download");
|
response.setContentType("application/force-download");
|
||||||
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));
|
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));
|
||||||
inputStream = new BufferedInputStream(new FileInputStream(filePath));
|
|
||||||
outputStream = response.getOutputStream();
|
// 结合 StreamingResponseBody 的流式写法
|
||||||
byte[] buf = new byte[1024];
|
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
|
||||||
|
OutputStream outputStream = response.getOutputStream()) {
|
||||||
|
byte[] buf = new byte[8192];
|
||||||
int len;
|
int len;
|
||||||
while ((len = inputStream.read(buf)) > 0) {
|
while ((len = inputStream.read(buf)) != -1) {
|
||||||
outputStream.write(buf, 0, len);
|
outputStream.write(buf, 0, len);
|
||||||
}
|
}
|
||||||
response.flushBuffer();
|
outputStream.flush();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("预览文件失败" + e.getMessage());
|
log.error("预览文件失败" + e.getMessage());
|
||||||
response.setStatus(404);
|
response.setStatus(404);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
|
||||||
if (inputStream != null) {
|
|
||||||
try {
|
|
||||||
inputStream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (outputStream != null) {
|
|
||||||
try {
|
|
||||||
outputStream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
|
||||||
import org.jeecg.modules.system.util.RandImageUtil;
|
import org.jeecg.modules.system.util.RandImageUtil;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.task.AsyncTaskExecutor;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@ -38,6 +39,9 @@ import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.SynchronousQueue;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -67,8 +71,11 @@ public class LoginController {
|
||||||
private BaseCommonService baseCommonService;
|
private BaseCommonService baseCommonService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private JeecgBaseConfig jeecgBaseConfig;
|
private JeecgBaseConfig jeecgBaseConfig;
|
||||||
|
|
||||||
private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
|
private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
|
||||||
|
/**
|
||||||
|
* 线程池用于异步发送纪要
|
||||||
|
*/
|
||||||
|
public static ExecutorService cachedThreadPool = new ShiroThreadPoolExecutor(0, 1024, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
|
||||||
|
|
||||||
@Operation(summary="登录接口")
|
@Operation(summary="登录接口")
|
||||||
@RequestMapping(value = "/login", method = RequestMethod.POST)
|
@RequestMapping(value = "/login", method = RequestMethod.POST)
|
||||||
|
@ -192,17 +199,7 @@ public class LoginController {
|
||||||
String username = JwtUtil.getUsername(token);
|
String username = JwtUtil.getUsername(token);
|
||||||
LoginUser sysUser = sysBaseApi.getUserByName(username);
|
LoginUser sysUser = sysBaseApi.getUserByName(username);
|
||||||
if(sysUser!=null) {
|
if(sysUser!=null) {
|
||||||
//update-begin--Author:wangshuai Date:20200714 for:登出日志没有记录人员
|
asyncClearLogoutCache(token, sysUser); // 异步清理
|
||||||
baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser);
|
|
||||||
//update-end--Author:wangshuai Date:20200714 for:登出日志没有记录人员
|
|
||||||
log.info(" 用户名: "+sysUser.getRealname()+",退出成功! ");
|
|
||||||
//清空用户登录Token缓存
|
|
||||||
redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
|
|
||||||
//清空用户登录Shiro权限缓存
|
|
||||||
redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
|
|
||||||
//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
|
|
||||||
redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
|
|
||||||
//调用shiro的logout
|
|
||||||
SecurityUtils.getSubject().logout();
|
SecurityUtils.getSubject().logout();
|
||||||
return Result.ok("退出登录成功!");
|
return Result.ok("退出登录成功!");
|
||||||
}else {
|
}else {
|
||||||
|
@ -210,6 +207,26 @@ public class LoginController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理用户缓存
|
||||||
|
*
|
||||||
|
* @param token
|
||||||
|
* @param sysUser
|
||||||
|
*/
|
||||||
|
private void asyncClearLogoutCache(String token, LoginUser sysUser) {
|
||||||
|
cachedThreadPool.execute(()->{
|
||||||
|
//清空用户登录Token缓存
|
||||||
|
redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
|
||||||
|
//清空用户登录Shiro权限缓存
|
||||||
|
redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
|
||||||
|
//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
|
||||||
|
redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
|
||||||
|
baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null, sysUser);
|
||||||
|
log.info("【退出成功操作】异步处理,退出后,清理用户缓存: "+sysUser.getRealname());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取访问量
|
* 获取访问量
|
||||||
* @return
|
* @return
|
||||||
|
|
Loading…
Reference in New Issue