Commit 85c69978 authored by wujiang's avatar wujiang

修改aop代码问题

parent 1eba123e
...@@ -43,8 +43,8 @@ import com.yeejoin.amos.feign.systemctl.Systemctl; ...@@ -43,8 +43,8 @@ import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.RegionModel; import com.yeejoin.amos.feign.systemctl.model.RegionModel;
/** /**
* controller层切面 用于用户数据缓存 供 sql自动填充使用 * controller层切面 用于用户数据缓存 供 sql自动填充使用 (使用粒度过大的Aop会创建大量代理对象,影响性能,占用内存,考虑使用
* (使用粒度过大的Aop会创建大量代理对象,影响性能,占用内存,考虑使用 WebMvcConfigurer#addInterceptors 添加拦截器 ) * WebMvcConfigurer#addInterceptors 添加拦截器 )
* *
* @author Admin * @author Admin
*/ */
...@@ -52,141 +52,152 @@ import com.yeejoin.amos.feign.systemctl.model.RegionModel; ...@@ -52,141 +52,152 @@ import com.yeejoin.amos.feign.systemctl.model.RegionModel;
@Component @Component
@Order(value = 0) @Order(value = 0)
public class ControllerAop { public class ControllerAop {
/** /**
* saveUserRedis设置过期时间 * saveUserRedis设置过期时间
*/ */
@Value("${redis.cache.failure.time}") @Value("${redis.cache.failure.time}")
private Long redisRegionTimeSecond; private Long redisRegionTimeSecond;
@Autowired @Autowired
private RedisUtils redisUtils; private RedisUtils redisUtils;
@Pointcut("(execution(public * com.yeejoin.amos.boot.module..*.biz.controller..*(..))" @Pointcut("(execution(public * com.yeejoin.amos.boot.module..*.biz.controller..*(..))"
+ "|| execution(public * com.yeejoin.amos.*.business.controller..*(..))" + "|| execution(public * com.yeejoin.amos.*.business.controller..*(..))"
+ " && !@annotation(org.springframework.scheduling.annotation.Scheduled))" + " && !@annotation(org.springframework.scheduling.annotation.Scheduled))"
+ "|| execution(public * com.yeejoin.equipmanage.controller..*.*(..))" + "|| execution(public * com.yeejoin.equipmanage.controller..*.*(..))"
+ "||execution(public * com.yeejoin.amos.api.openapi.controller..*(..))") + "|| execution(public * com.yeejoin.amos.api.openapi.controller..*(..))")
public void userCache() { public void userCache() {
} }
@Before("userCache()") @Before("userCache()")
public void doBefore(JoinPoint joinPoint) { public void doBefore(JoinPoint joinPoint) {
PermissionInterceptorContext.clean(); PermissionInterceptorContext.clean();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = null; HttpServletRequest request = null;
if(ObjectUtils.isNotEmpty(attributes)){ if (ObjectUtils.isNotEmpty(attributes)) {
request = attributes.getRequest(); request = attributes.getRequest();
} else { } else {
return; return;
} }
// 不需要添加请求头的接口 // 不需要添加请求头的接口
String[] url = new String[]{"/api/user/save/curCompany", "/jcs/command/lookHtmlText", String[] url = new String[] { "/api/user/save/curCompany", "/jcs/command/lookHtmlText",
"/jcs/common/duty-person/findByDutyAreaId", "/tzs/wechatBack", "/tzs/elevator/getElevatorInfo", "/jcs/common/duty-person/findByDutyAreaId", "/tzs/wechatBack", "/tzs/elevator/getElevatorInfo",
"/openapi/bizToken/applyToken"}; "/openapi/bizToken/applyToken", "/tzs/reg-unit-info/management-unit/tree",
// 获取请求路径 "/tzs/flc-unit-info/region/tree", "/tzs/reg-unit-info/unit-type/list" };
for (String uri : url) { // 获取请求路径
if (request.getRequestURI().indexOf(uri) != -1) { for (String uri : url) {
return; if (request.getRequestURI().indexOf(uri) != -1) {
} return;
} }
//TODO tyboot 框架拦截器已缓存数据 }
String token = RequestContext.getToken(); // TODO tyboot 框架拦截器已缓存数据
String token = RequestContext.getToken();
// 不需要校验token的接口直接返回 // 不需要校验token的接口直接返回
if (joinPoint.getSignature() instanceof MethodSignature) { if (joinPoint.getSignature() instanceof MethodSignature) {
return; if (!((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(TycloudOperation.class).needAuth() && !request.getParameterMap().containsKey("token") && ValidationUtil.isEmpty(token)) {
} return;
// 平台studio配置的下载接口token从url里取
if (ValidationUtil.isEmpty(token)) {
fillRequestContext(request);
token = RequestContext.getToken();
}
if (token != null) {
String pattern = RedisKey.buildPatternKey(token);
//验证token有效性,防止token失效
AgencyUserModel userModel;
try {
FeignClientResult<AgencyUserModel> agencyUserModel = Privilege.agencyUserClient.getme();
userModel = agencyUserModel.getResult();
if (userModel == null) {
throw new Exception("无法获取用户信息");
}
RequestContext.setExeUserId(userModel.getUserId());
} catch (Exception e) {
//删除失效token缓存
redisUtils.getAndDeletePatternKeys(pattern);
throw new RuntimeException(e.getMessage());
} }
saveUserRedis(userModel, token);
} else {
throw new AuthException("请求未包含认证信息.");
} }
}
private void saveUserRedis(AgencyUserModel user, String token) { // 平台studio配置的下载接口token从url里取
String authToken = RedisKey.buildReginKey(user.getUserId(), token); if (ValidationUtil.isEmpty(token)) {
if (redisUtils.hasKey(authToken)) { fillRequestContext(request);
return; token = RequestContext.getToken();
} }
CompanyBo company = new CompanyBo(); if (token != null) {
DepartmentBo department = new DepartmentBo(); String pattern = RedisKey.buildPatternKey(token);
RoleBo role = new RoleBo(); // 验证token有效性,防止token失效
//平台更新 人员部门可能为NULL 导致redis缓存不到人员信息 AgencyUserModel userModel;
Map<Long, List<DepartmentModel>> mapDepartments = new HashMap<>(); try {
DepartmentModel departmentM = new DepartmentModel(); FeignClientResult<AgencyUserModel> agencyUserModel = Privilege.agencyUserClient.getme();
CompanyModel companyM = user.getCompanys() != null ? user.getCompanys().get(0) : null; userModel = agencyUserModel.getResult();
Bean.copyExistPropertis(companyM, company); if (userModel == null) {
if (!ValidationUtil.isEmpty(user.getCompanyDepartments())){ throw new Exception("无法获取用户信息");
mapDepartments = user.getCompanyDepartments(); }
departmentM = companyM != null ? mapDepartments.get(companyM.getSequenceNbr()).get(0) : null; RequestContext.setExeUserId(userModel.getUserId());
} } catch (Exception e) {
Bean.copyExistPropertis(departmentM, department); // 删除失效token缓存
Map<Long, List<RoleModel>> roles = user.getOrgRoles(); redisUtils.getAndDeletePatternKeys(pattern);
Long sequenceNbr; throw new RuntimeException(e.getMessage());
if (departmentM == null) { }
sequenceNbr = null; saveUserRedis(userModel, token);
} else { } else {
sequenceNbr = departmentM.getSequenceNbr(); throw new AuthException("请求未包含认证信息.");
} }
RoleModel roleM = null; }
if (sequenceNbr == null) {
roleM = companyM != null ? roles.get(companyM.getSequenceNbr()).get(0) : null; private void saveUserRedis(AgencyUserModel user, String token) {
} else { String authToken = RedisKey.buildReginKey(user.getUserId(), token);
roleM = roles.get(sequenceNbr).get(0); if (redisUtils.hasKey(authToken)) {
} return;
if(companyM!=null&&companyM.getRegionSeq()!=null) }
{ CompanyBo company = new CompanyBo();
FeignClientResult<RegionModel> result = Systemctl.regionClient.getRegion(Long.valueOf(companyM.getRegionSeq())); DepartmentBo department = new DepartmentBo();
company.setRegionCode(String.valueOf(result.getResult().getRegionCode())); RoleBo role = new RoleBo();
} // 平台更新 人员部门可能为NULL 导致redis缓存不到人员信息
Bean.copyExistPropertis(roleM, role); Map<Long, List<DepartmentModel>> mapDepartments = new HashMap<>();
ReginParams reginParams = new ReginParams(); DepartmentModel departmentM = new DepartmentModel();
reginParams.setCompany(company); CompanyModel companyM = user.getCompanys() != null ? user.getCompanys().get(0) : null;
reginParams.setRole(role); Bean.copyExistPropertis(companyM, company);
reginParams.setDepartment(department); if (!ValidationUtil.isEmpty(user.getCompanyDepartments())) {
reginParams.setUserModel(user); mapDepartments = user.getCompanyDepartments();
redisUtils.set(authToken, JSONObject.toJSONString(reginParams), redisRegionTimeSecond); departmentM = companyM != null ? mapDepartments.get(companyM.getSequenceNbr()).get(0) : null;
} }
Bean.copyExistPropertis(departmentM, department);
Map<Long, List<RoleModel>> roles = user.getOrgRoles();
Long sequenceNbr;
if (departmentM == null) {
sequenceNbr = null;
} else {
sequenceNbr = departmentM.getSequenceNbr();
}
RoleModel roleM = null;
if (sequenceNbr == null) {
roleM = companyM != null ? roles.get(companyM.getSequenceNbr()).get(0) : null;
} else {
roleM = roles.get(sequenceNbr).get(0);
}
if (companyM != null && companyM.getRegionSeq() != null) {
FeignClientResult<RegionModel> result = Systemctl.regionClient
.getRegion(Long.valueOf(companyM.getRegionSeq()));
company.setRegionCode(String.valueOf(result.getResult().getRegionCode()));
}
Bean.copyExistPropertis(roleM, role);
ReginParams reginParams = new ReginParams();
reginParams.setCompany(company);
reginParams.setRole(role);
reginParams.setDepartment(department);
reginParams.setUserModel(user);
redisUtils.set(authToken, JSONObject.toJSONString(reginParams), redisRegionTimeSecond);
}
@AfterReturning(returning = "ret", pointcut = "userCache()") @AfterReturning(returning = "ret", pointcut = "userCache()")
public void doAfterReturning(Object ret) throws Throwable { public void doAfterReturning(Object ret) throws Throwable {
//统一redis管理 // 统一redis管理
// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// HttpServletRequest request = attributes.getRequest(); // HttpServletRequest request = attributes.getRequest();
// String token = request.getHeader("token"); // String token = request.getHeader("token");
// if (token != null) { // if (token != null) {
// GlobalCache.paramMap.remove(token); // GlobalCache.paramMap.remove(token);
// } // }
} }
private void fillRequestContext(HttpServletRequest request) { private void fillRequestContext(HttpServletRequest request) {
String token = request.getParameterMap().get("token")[0]; String token = null;
String product = request.getParameterMap().get("product")[0]; String product = null;
String appKey = request.getParameterMap().get("appKey")[0]; String appKey = null;
RequestContext.setToken(token); if (request != null && request.getParameterMap() != null) {
RequestContext.setProduct(product); if (request.getParameterMap().get("token") != null && request.getParameterMap().get("product") != null
RequestContext.setAppKey(appKey); && request.getParameterMap().get("appKey") != null) {
} token = request.getParameterMap().get("token")[0];
product = request.getParameterMap().get("product")[0];
appKey = request.getParameterMap().get("appKey")[0];
RequestContext.setToken(token);
RequestContext.setProduct(product);
RequestContext.setAppKey(appKey);
}
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment