SpringBoot——整合拦截器(Interceptor)

目录

 拦截器(Interceptor)

项目总结

新建一个SpringBoot项目​编辑

MyInterceptor自定义拦截器

InterceptorConfig配置类

InterceptorController控制器

 SpringbootInterceptorApplication启动类


 

在开发SpringBoot项目时,开发人员经常需要对HTTP请求进行拦截和处理,以实现诸如身份验证、授权、日志记录等功能。为了实现这些功能,Spring Boot提供了过滤器和拦截器这两个工具。此外,开发人员还需要使用SpringBoot中的监听器监听SpringBoot项目中的特定事件,以实现统计网站访问量、记录用户访问路径、系统启动时加载初始化信息等功能。

 拦截器(Interceptor)

  • SpringBoot的拦截器用于拦截用户请求并做相应的处理。例如验证用户是否登录、日志记录、权限管理等。
  • 拦截器可以在控制器类中的方法被执行前和被执行后对请求做一些处理
  • 实现拦截器,主要是实现HandlerInterceptor接口,该接口有三大方法:
    • preHandle():方法执行前,处理请求时
    • postHandle():方法执行后,处理请求时
    • afterCompletion():请求结束后
  • 过滤器与拦截器的主要区别在于触发的时机不同

项目总结

  • 该项目的目的在于拦截请求,让请求进入控制器类的一个方法,并读取请求中的value参数的值,在控制器类处理完请求后,再次拦截请求,查看请求中value参数值是否发生变化 
  • 前后发生了变化,证明拦截器成功拦截了请求,并指使它干了某些事

新建一个SpringBoot项目

项目结构:

MyInterceptor自定义拦截器

package com.study.springboot_interceptor.intercepter;

import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * preHandle()方法会在控制器类中的方法被执行之前,对请求进行处理时被执行
     * @param request   请求对象
     * @param response  响应对象
     * @param handler   请求的处理程序对象
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
        if(handler instanceof HandlerMethod){//如果是HandlerMethod对象
            HandlerMethod method=(HandlerMethod) handler;
            //通过handler对象的类型知晓请求将进入控制器类中的哪个方法
            System.out.println("(1)请求访问控制器类中的方法是:"+method.getMethod().getName()+"()");
            Object value=request.getAttribute("value");//读取请求的某个属性,默认为null
            System.out.println("   执行方法前:value="+value);
            return true;
        }
        return false;
    }
    //postHandle()方法会在控制器类中的方法被执行之后,对请求进行处理时被执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler,
                            @Nullable ModelAndView modelAndView){
        Object value=request.getAttribute("value");//执行完请求,再读取此属性
        System.out.println("(2)执行方法后:value="+value);
    }
    //afterCompletion()方法会在整个请求结束之后被执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler,
                           @Nullable  Exception ex){
        request.removeAttribute("value");//执行完请求,再读取此属性
        System.out.println("(3)整个请求都执行完毕,在此做一些资源释放工作");
    }
}

InterceptorConfig配置类

package com.study.springboot_interceptor.config;

import com.study.springboot_interceptor.intercepter.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry){
        InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
        registration.addPathPatterns("/**");//拦截所有路径,/**表示匹配多层地址
    }
}

InterceptorController控制器

package com.study.springboot_interceptor.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
@RestController
public class InterceptorController {

    @RequestMapping("/index")
    public String index(){
        return "欢迎访问XXX网站";
    }

    @RequestMapping("/login")
    public String login(HttpServletRequest request){
        request.setAttribute("value","登录前在此保存了一些属性值");//向请求中插入一个属性值
        return "请先登录";
    }
}

 SpringbootInterceptorApplication启动类

package com.study.springboot_interceptor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootInterceptorApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootInterceptorApplication.class, args);
	}

}
  • 启动项目,依次访问网址
    • http://localhost:8080/index
    • http://localhost:8080/login 
  • 访问第二个网址时,请求被login()方法处理后,value参数就有了新值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

戏拈秃笔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值