目录✅
Spring Boot 统⼀功能处理,也就是上一节 Spring AOP 的实战应用环节,本节要实现的目标有以下 3 个:
- 统⼀⽤户登录权限验证;
- 统⼀数据格式返回;
- 统⼀异常处理。
这三个应用基本涵盖了企业开发中需要实现的需求,所以把这三个操作弄懂弄熟是很有必要的!
1. 用户登录权限效验
在实现进行用户是否登录了的校验时,学习了spring AOP 之后,我们就可以实现统一的用户登录验证处理了,具体实现是应用到了springboot的拦截器,下面就来进行详细的使用讲解:
1.1 Spring AOP 用户统⼀登录验证的问题
在讲解spring拦截器之前,我们需要知道为什么要使用拦截器,而不是使用前面spring AOP中的前置通知或者环绕通知:
这两个方案具体代码如下:
@Component
@Aspect
public class UserAspect {
// 定义切点方法 controller 包下,子孙包下所有类的所有方法
@Pointcut("execution(* com.example.demo.controller..*.*(..))")
public void pointcut(){
}
// 前置方法
@Before("pointcut()")
public void doBefore(){
System.out.println("这里执行前置方法逻辑");
}
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint){
Object obj=null;
System.out.println("Around 方法开始执行");
try {
// 执行拦截方法
obj=proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("Around 方法结束执行");
return obj;
}
}
如果要在以上 Spring AOP 的切⾯中实现⽤户登录权限效验的功能,有以下两个问题:
- 没办法获取到 HttpSession 对象。(判断用户是否登录用到)
- 我们要对⼀部分⽅法进⾏拦截,⽽另⼀部分⽅法不拦截,如注册⽅法和登录⽅法是不拦截的,这样的话排除⽅法的规则很难定义,甚⾄没办法定义。(除了登录注册不拦截,静态资源不拦截,其余基本都要拦截)
为了解决以上使用spring AOP 没法实现的地方,我们就需要使用到 spring 拦截器,以下是拦截器的详细用法:
1.2 Spring 拦截器
对于以上问题 Spring 中提供了具体的实现拦截器:HandlerInterceptor
,拦截器的实现分为以下两个步骤:
- 创建⾃定义拦截器,实现
HandlerInterceptor
接⼝的preHandle
(执⾏具体⽅法之前的预处理,拦截逻辑就写在这)⽅法。 - 将⾃定义拦截器加⼊
WebMvcConfigurer
的addInterceptors
⽅法中(加入系统配置,定义拦截规则)
具体实现如下:
1.2.1 自定义拦截器
接下来使用代码来实现⼀个⽤户登录的权限效验,⾃定义拦截器是⼀个普通类,具体实现代码如下:
/**
* 自定义用户登录的拦截器
*/
@Component // 需要用到属性注入此类时候加
public class LoginIntercept implements HandlerInterceptor {
/**
* 返回TRUE表示拦截判断通过,可以访问后面的接口,如果返回FALSE表示拦截未通过,直接返回结果给前端
*
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1.得到 httpsession 对象
HttpSession session=request.getSession(false);
if (session!=null && session.getAttribute("userinfo")!=null){
// 表示已登录
return true;
}
// 执行到此行代码表示未登录,跳转到登录页面
response.sendRedirect("/login.html");