Aspecj实现的AOP,AOP实现的登录校验

①需要导入的jar包

<!--AOP-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>

<!--Aspectj-->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>

②需要配置的XML文件(需将切面类注入到spring容器中)

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<!--aspectj自动代理-->
<aop:aspectj-autoproxy/>
<!--注入切面类-->
<context:component-scan base-package="njupt.test.ssm.aop"/>

③编写切面类

@Component
@Aspect
public class UserAop {
@Pointcut("execution(public * njupt.test.ssm.controller.StudentController.*(..))")
public void pointCut(){}

@Before("pointCut()")
public void testCheck(){
System.out.println("1");
}

@Around("pointCut()")
public void checkRoleAop(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("方法执行前");
joinPoint.proceed();
System.out.println("方法执行后");

}

}

AOP实现的登录校验

 

1.首先需要在登录的时候设置session,将用户信息写入session

controller层:

@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;

@RequestMapping(value = "/loginCheck",method = RequestMethod.GET)
@ResponseBody
public ServerResponse<User> loginCheck(HttpSession session, @RequestParam("userId") String userId,
@RequestParam("userPassword")String userPassword){
ServerResponse<User> serverResponse = userService.loginCheck(userId,userPassword);
if (serverResponse.checkIsSuccess()){
//设置session
session.setAttribute("user",serverResponse.getData());
return serverResponse;
}
return ServerResponse.createByError("账号或密码错误!");
}
}

2.调用功能时,校验用户是否登录,登录权限(以管理员为例)写一个切面类

@Component
@Aspect
public class UserAop {
@Pointcut("execution(public * njupt.test.ssm.controller.StudentController.*(..))")
public void pointCut(){}


@Around("pointCut()")
public ServerResponse checkRoleAop(ProceedingJoinPoint joinPoint) throws Throwable {
//获取请求域
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//获取session中的信息
User user = (User) request.getSession().getAttribute("user");
if (user == null){
return ServerResponse.createByNeedLogin();
}
if (user.getUserRole()!=1){
return ServerResponse.createByError("非管理员,无此权限!");
}
return (ServerResponse) joinPoint.proceed();
}

}

附:获取被代理类信息的方法

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
 HttpServletRequest request = attributes.getRequest();
//url
logger.info("url={}", request.getRequestURL());
//method
logger.info("method={}", request.getMethod());
//ip
logger.info("ip={}", request.getRemoteAddr());
//类方法
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
//参数
logger.info("args={}", joinPoint.getArgs());

猜你喜欢

转载自blog.csdn.net/weixin_42228338/article/details/81201684