接下来是springBoot统一功能处理模块,这也是AOP的实践部分。要实现三个课程目标:
让我们一一看看。
用户登录权限的发展已经从以前的各个方法中对用户登录权限进行自我验证,到现在的统一的用户登录验证处理。这是一个逐步完善和优化的过程。
我们先回顾一下初始用户登录验证的实现方法:
@RestController
@RequestMapping("/用户")
公共类 UserController {
/**
@RequestMapping("/m1") 公共对象方法(HttpServletRequest request) { //如果有session就获取它,如果没有就不会创建
HttpSession session = request.getSession(假);
&& session.getAttribute("用户信息") != null) {
//表明您已登录,业务正在正在处理
返回 true;
} 否则 假;
**
* 某种方法 2
*/
"/m2")
公共 对象 方法2(HttpServletRequest请求) {
获取,如果没有创建则不会创建
(session != null && session.getAttribute("userinfo") != null) {
//说明已登录,业务处理中
返回 真;
} else {
返回 假; }
//其他方法...
}
从上面的代码可以看出,每种方法都有相同的用户登录验证权限,其缺点是:
所以迫切需要提供一个公共的AOP方法来统一用户登录权限验证。
说起统一用户登录验证,我们第一个想到的实现方案就是Spring AOP前置通知或者环绕通知。具体实现代码如下:
导入 org.aspectj.lang.ProceedingJoinPoint;
导入 org.aspectj.lang.annotation.*;
导入 org.springframework.stereo type.Component;
@Aspect
@Component
公共 类 UserA spect {
//定义切点 方法控制器包及其后代包下所有类的所有方法
@Pointcut("execution(* com.example.demo.controller..*.*(.. ) )")
公共void切入点(){ }
//前置方式
@Before("切入点()")
公共 void doBefore(){
}
//包围法 @Around( “切入点()”)
public对象doAround(ProceedingJoinPoint joinPoint){
对象obj = null;
System.out.println( "Around 方法开始执行");拦截方法
} catch(可投掷可投掷){
System.out.println(" around方法结束执行") ;
返回 obj;该方面有两个函数实现用户登录权限验证。问题:
-
没有办法获取HttpSession对象。
-
我们需要拦截一些方法,但不需要拦截其他方法。例如注册方法和登录方法不被拦截。在这种情况下,排除方法的规则很难定义,甚至不可能。方法定义。
如何解决这个问题?
1.3弹簧拦截器
针对上述问题,Spring提供了具体的实现拦截器:HandlerInterceptor
。拦截器的实现分为以下两步:
-
创建自定义拦截器,并实现HandlerInterceptor
接口的preHandle
(执行特定方法之前的预处理)方法。
-
将自定义拦截器添加到WebMvcConfigurer
的addInterceptors
方法中。
具体实现如下。
补充过滤器: