Springboot——拦截器

目录

一、拦截器概念

二、拦截器的使用

 2.1  拦截器的创建(preHandle实用性最强)

 2.2 将拦截器添加到容器当中

三、拦截器参数

3.1 获取请求头 request.getHeader

3.2 Object handler 是什么参数

         3.3 ModelAndView modelAndView

3.4 Exception ex

3.5 HttpServletRequest request

3.6 HttpServletResponse response

四、多拦截器执行顺序


一、拦截器概念

  拦截器(Interceptor):是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行(类似有保安拦截检查,正常才通过)

  作用:

  • 在指定的方法调用前后执行预先设定的代码(比如权限的校验就是在访问controller之前校验)
  • 阻止原始方法的执行(把原始的方法终止掉)

 

拦截器与过滤器的区别

  •  归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  •  拦截器内容不同:Filter对所有访问进行增强(在Tomcat服务器进行配置),Interceptor仅针对SpringMVC的访问进行增强

二、拦截器的使用

 2.1  拦截器的创建(preHandle实用性最强)

/**
 * 登录检查
 * 1.配置到拦截器要拦截哪些请求
 * 2.把这些配置放在容器中
 *
 * 实现HandlerInterceptor接口
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前
     * 登录检查写在这里,如果没有登录,就不执行目标方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//      获取进过拦截器的路径
        String requestURI = request.getRequestURI();

        //      登录检查逻辑
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser !=null){
//          放行
            return true;
        }
//      拦截   就是未登录,自动跳转到登录页面,然后写拦截住的逻辑
        return false;
    }

    /**
     * 目标方法执行完成以后
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 页面渲染以后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

 2.2 将拦截器添加到容器当中

@Configuration
//定制SpringMVC的一些功能都使用WebMvcConfigurer
public class AdminWebConfig implements WebMvcConfigurer {

    /**
     * 配置拦截器
     * @param registry 相当于拦截器的注册中心
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//       下面这句代码相当于添加一个拦截器   添加的拦截器就是我们刚刚创建的
         registry.addInterceptor(new LoginInterceptor())
//       addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源
                 .addPathPatterns()
//       excludePathPatterns()表示我们要放行哪些(表示不用经过拦截器)
//       excludePathPatterns("/","/login")表示放行“/”与“/login”请求
//       如果有静态资源的时候可以在这个地方放行
                 .excludePathPatterns("/","/login");
    }
}

三、拦截器参数

3.1 获取请求头 request.getHeader

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String contenType = request.getHeader("Content-Type");
        System.out.println("preHandle..."+contenType);
//      放行
        return true;
    }

 

3.2 Object handler 是什么参数

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String contenType = request.getHeader("Content-Type");
        System.out.println(handler);
        System.out.println("preHandle..."+contenType);
//      放行
        return true;
    }

使用PostMan发送请求后,控制台出现下面这个样子

class org.springframework.web.method.HandlerMethod

这个参数有什么用?

   被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String contenType = request.getHeader("Content-Type");
//        System.out.println(handler);
        HandlerMethod hm = (HandlerMethod)handler;
//        通过hm.getMethod()就可以拿到原始执行的对象,拿到这个对象就可以进行反射
         hm.getMethod();
        System.out.println("preHandle..."+contenType);
//      放行
        return true;
    }

3.3 ModelAndView modelAndView

封装了SpringMVC进行页面跳转的相关数据,但是我们现在都是反JSON,一般不会这么搞了

3.4 Exception ex

通过这个ex可以拿到原始的程序执行过程中出现的异常的

假设controller层抛了异常,在这里是可以拿到异常对象的,但是我们有异常处理机制,所以这里就没有那么大的需求了

如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

3.5 HttpServletRequest request

   request:请求对象


3.6 HttpServletResponse response

  response:响应对象

四、多拦截器执行顺序

 当配置多个拦截器时,形成拦截器链

 下图是第二个拦截器


@Configuration
//定制SpringMVC的一些功能都使用WebMvcConfigurer
public class AdminWebConfig implements WebMvcConfigurer {

    /**
     * 配置拦截器
     * @param registry 相当于拦截器的注册中心
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//       下面这句代码相当于添加一个拦截器   添加的拦截器就是我们刚刚创建的
         registry.addInterceptor(new LoginInterceptor())
//       addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源
                 .addPathPatterns()
//       excludePathPatterns()表示我们要放行哪些(表示不用经过拦截器)
//       excludePathPatterns("/","/login")表示放行“/”与“/login”请求
//       如果有静态资源的时候可以在这个地方放行
                 .excludePathPatterns("/","/login");

//       第二个拦截器
        registry.addInterceptor(new LoginInterceptor2()).addPathPatterns("/books");
    }
}

那当我们配置了两个拦截器以后,会有一个执行顺序

拦截器链的运行顺序参照拦截器添加顺序为准,下面就是三个拦截器时的执行顺序

 

<think>好的,用户想了解如何在Spring Boot中实现登录拦截器的示例或教程。我需要先回顾一下相关知识,确保步骤正确,并且符合Spring Boot的最佳实践。 首先,登录拦截器通常属于Spring MVC的HandlerInterceptor接口的实现。需要实现三个方法:preHandle、postHandle和afterCompletion。其中preHandle方法在请求处理前执行,适合做登录验证。 接下来,用户可能需要配置拦截器,这涉及到WebMvcConfigurer的addInterceptors方法。需要指定拦截的路径和排除的路径,比如登录页面和静态资源不需要拦截。 然后,用户可能需要处理会话管理,比如使用HttpSession来存储用户登录状态。在拦截器中检查Session是否存在用户信息,如果不存在则重定向到登录页面。 还要注意组件的扫描,确保拦截器和配置类被Spring Boot正确加载。使用@Configuration注解配置类,可能还需要在主应用类上使用@SpringBootApplication,它包含了@ComponentScan。 另外,示例代码的准确性很重要。需要展示拦截器的实现类和配置类的代码,并且指出关键点,比如路径配置、排除路径、Session检查等。 用户可能还关心常见问题,比如拦截器不生效的原因,可能是配置路径错误或组件未被扫描到。此外,推荐更现代的拦截方式,比如使用过滤器或Spring Security,但拦截器更轻量,适合简单需求。 需要检查是否有引用相关的资料,但用户提供的引用似乎与登录拦截器相关,但内容可能不完整。不过示例中引用了两个来源,可以适当提及,但主要依靠正确的代码示例。 最后,生成相关问题,帮助用户深入理解,比如拦截器与过滤器的区别、Session管理方法、排除静态资源的方式,以及如何结合注解进行权限控制等。</think>以下是在Spring Boot中实现登录拦截器的完整示例和步骤说明: ### 一、实现登录拦截器 1. 创建自定义拦截器类 ```java @Component public class LoginInterceptor implements HandlerInterceptor { // 请求处理前执行(Controller方法调用前) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); // 检查session中是否存在登录标识 Object userInfo = session.getAttribute("USER_INFO"); if (userInfo == null) { response.sendRedirect("/login"); return false; // 中断请求 } return true; // 继续执行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {} @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {} } ``` ### 二、配置拦截器规则 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns( // 排除路径 "/login", // 登录页 "/static/**", // 静态资源 "/error" // 错误页 ); } } ``` ### 三、关键配置说明 1. `@Component`确保拦截器Spring管理[^1] 2. `WebMvcConfigurer`接口用于配置拦截器 3. 排除路径建议至少包含: - 登录相关接口 - 静态资源路径 - 错误处理路径 ### 四、登录验证实现示例 ```java @Controller public class LoginController { @PostMapping("/doLogin") public String login(String username, String password, HttpSession session) { if ("admin".equals(username) && "123456".equals(password)) { session.setAttribute("USER_INFO", username); return "redirect:/index"; } return "login"; } } ``` ### 五、常见问题处理 1. **拦截器不生效**: - 检查是否添加了`@Configuration`注解 - 确认拦截路径配置正确 - 主启动类需在拦截器所在包的上层目录 2. **推荐方案**: - 简单场景使用拦截器 - 复杂权限控制建议使用Spring Security - API接口推荐使用JWT验证
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱布朗熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值