此案例是改变companyId,这个业务逻辑是不对的(因为session存在服务器端,改变companyId并发情况下会出现问题),此举只是单独举例 自定义注解
package nbpt.ts.zhaf.util.annotations;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.TYPE})//@Target其中参数类型是ElementType[]数组,其中ElementType是枚举类型
@Retention(RetentionPolicy.RUNTIME)//@Retention 表明该注解的生命周期,其中RetentionPolicy 是枚举类型
@Documented//表明该注解标记的元素可以被Javadoc 或类似的工具文档化
public @interface ConvertSecondLevelCompanyId {
String value() default "";
}
package nbpt.ts.zhaf.util.aspect;
import nbpt.ts.zhaf.Constants;
import nbpt.ts.zhaf.domain.User;
import nbpt.ts.zhaf.entity.Company;
import nbpt.ts.zhaf.service.CompanyService;
import nbpt.ts.zhaf.util.annotations.ConvertSecondLevelCompanyId;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect //定义一个切面
@Configuration
public class ConvertSecondLevelCompanyIdAspect {
@Autowired
private CompanyService companyService;
private Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 定义切点Pointcut
*/
@Pointcut(value = "@annotation(nbpt.ts.zhaf.util.annotations.ConvertSecondLevelCompanyId)")
public void pointcutService() {
}
@Before("@annotation(convertSecondLevelCompanyId)")
public void doBeforeMethod(ConvertSecondLevelCompanyId convertSecondLevelCompanyId) {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION_KEY);
if (!ObjectUtils.isEmpty(request.getParameter("sourceCompanyId"))) {
log.info("{},doBeforeMethod执行前的companyId:{},cacheCompanyId:{}", convertSecondLevelCompanyId.value(), user.getCompanyId(), user.getCacheCompanyId());
Integer companyId = Integer.valueOf(request.getParameter("sourceCompanyId"));
user.setCacheCompanyId(user.getCompanyId());
user.setCompanyId(companyId);
Company company = companyService.getCompanyById(companyId);
user.setCompany(company);
log.info("{},doBeforeMethod执行后的companyId:{},cacheCompanyId:{}", convertSecondLevelCompanyId.value(), user.getCompanyId(), user.getCacheCompanyId());
}
}
@After("@annotation(convertSecondLevelCompanyId)")
public void doAfterMethod(ConvertSecondLevelCompanyId convertSecondLevelCompanyId) {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION_KEY);
if (!ObjectUtils.isEmpty(user) && !ObjectUtils.isEmpty(user.getCacheCompanyId())) {
log.info("{},doAfterMethod执行前的companyId:{},cacheCompanyId:{}", convertSecondLevelCompanyId.value(), user.getCompanyId(), user.getCacheCompanyId());
Integer companyId = user.getCacheCompanyId();
user.setCompanyId(companyId);
user.setCacheCompanyId(null);
Company company = companyService.getCompanyById(companyId);
user.setCompany(company);
log.info("{},doAfterMethod执行后的companyId:{},cacheCompanyId:{}", convertSecondLevelCompanyId.value(), user.getCompanyId(), user.getCacheCompanyId());
}
}
}