springmvc-拦截器

发布于:2025-05-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

一,拦截器的职责

二,拦截器的应用场景

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

四,使用拦截器

一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

二 ,编写拦截器配置类用于配置拦截器的执行位置。

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

preHandle方法返回值:false 拦截,不进行到下一步


一,拦截器的职责

  • 拦截,访问controller控制层的映射路径

二,拦截器的应用场景

  • 权限验证:
  • 当你浏览某一界面,想要点击去看,发现 你没有登录,就会跳转到登录界面

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端

四,使用拦截器

准备工作:添加web起步依赖


一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

作用:制定拦截规则,当拦截到指定的映射路径

重写三个方法【preHandle、postHandle、afterCompletion】)。该类要交给spring容器管理(把注解@Component写在类上)

package interpector;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {
    //  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before controller doing");
        // 返回false 表示拦截,返回true 表示放行
        return true;
    }
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。
    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afer controller doing........");
    }
//     postHandle 方法controller类中被访问方法执行时候执行。
    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("doing controller......");
    }
}


二 ,编写拦截器配置类用于配置拦截器的执行位置。

作用:将自定义拦截类注册和添加拦截路径

该类继承WebMvcConfigurationSupport类,重写addInterceptors方法,在此方法的实现中添加拦截路径)

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {
    // 注入拦截器对象
 @Autowired
    private Userlnterpector userInterpector;
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 拦截器注册,添加拦截路径/user/**,给静态资源放行/static/** 
        registry.addInterceptor(userInterpector).addPathPatterns("/user/**").excludePathPatterns("/static/**");

    }
}

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

springmvc配置类

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {

}

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

按照以下顺序,执行

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端


案例

自定义拦截类代码:

package interpector;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {
    //  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before controller doing");
        // 返回false 表示拦截,返回true 表示放行
        return true;
    }
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。
    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afer controller doing........");
    }
//     postHandle 方法controller类中被访问方法执行时候执行。
    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("doing controller......");
    }
}

拦截配置类

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {
    // 注入拦截器对象
 @Autowired
    private Userlnterpector userInterpector;
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 拦截器注册,添加拦截路径/user/**
        registry.addInterceptor(userInterpector).addPathPatterns("/user/**");

    }
}

springmvc加载 拦截配置类和扫描拦截类所在的包

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {

}

controller类被访问的方法

package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class userController {
    @RequestMapping("/login")
    public String login(){
        System.out.println("rwrwr");
        System.out.println("login11111111111111");
        return "ok";
    }
}

测试

比较:【客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端】


preHandle方法返回值:false 拦截,不进行到下一步

测试


网站公告

今日签到

点亮在社区的每一天
去签到