您现在的位置是:首页 >学无止境 >Spring 拦截器网站首页学无止境

Spring 拦截器

程序猿小马 2024-06-17 10:26:13
简介Spring 拦截器

目录

今日良言:心若有所向往,何惧道阻且长

一、Spring 拦截器

1.拦截器简介

2.实现自定义拦截器


今日良言:心若有所向往,何惧道阻且长

一、Spring 拦截器

1.拦截器简介

Spring Boot 拦截器是面向切面编程-----AOP 的具体实现,用于对请求做预处理。

正常情况下的调用顺序:

 当有了拦截器之后,会对用户的请求进行预处理,也就是在Controller之前进行相应的业务处理,如下:

2.实现自定义拦截器

实现一个自定义拦截器主要分为两步:

1).定义拦截器

   创建⾃定义拦截器,实现 HandlerInterceptor 接⼝的 preHandle(执⾏具体⽅法之前的预处理)方法。

代码如下:

/**
 * 自定义拦截器
 */
@Component // 存入spring容器中
public class LoginInterceptor implements HandlerInterceptor {
    // 调用目标方法之前执行的方法
    // 此方法返回boolean 类型的值
    // 如果返回的是true 表示拦截器拦截成功 继续走后面的流程  执行目标方法
    // 如果返回的是false 表示拦截器拦截失败, 验证不通过,后续的流程和目标方法不要执行了。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);// 没有就不创建session
        if (session != null && session.getAttribute("user") != null) {
            return true;
        }
        // 设置返回数据格式
        response.setContentType("application/json;charset=utf8");
        response.getWriter().println("{"code":-1,"msg":"登录失败","data":""}");
        return false;
    }
}

2),配置拦截规则

将⾃定义拦截器加⼊ WebMvcConfigurer 的 addInterceptors ⽅法中。

/**
 * @author 26568
 * @date 2023-05-15 20:11
 */
@Configuration   // 配置项 
public class MyConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")   // * 表示拦截一级URL ** 表示拦截所有URL
                .excludePathPatterns("/user/login")  // 排除url   /user/login 不拦截
                .excludePathPatterns("/user/reg")    // 排除url  /user/reg    不拦截
        ;
    }
}

在controller包下创建一个UserController来进行相关操作。

 代码如下:

/**
 * @author 26568
 * @date 2023-05-15 20:15
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String login() {
        return "login";
    }
    @RequestMapping("/reg")
    public Object register() {
        return "reg";
    }
    @RequestMapping("/index")
    public Object index() {
        return "index";
    }
}

然后启动项目,查看效果:

当访问url 为 127.0.0.1:8080/user/reg 和 127.0.0.1:8080/user/login 时,由于没有拦截,会看到返回结果:

 

 但是此时访问127.0.0.1:8080/user/index 时,会被拦截。

 这里拦截以后返回的结果,就是之前定义拦截器返回的结果。由于这里是简单的代码,并没有session,所以会返回false,但是这里拦截成功了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。