springboot 拦截器_SpringBoot 中对拦截器的简单使用

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享 

明确需求

我们的部分接口需要访问者具有相应的权限才能进行相应的访问,即需要有正确的通行密码才能放行。看到这个需求,相应大家脑海中瞬间浮现出一个词 – 拦截器,确实,我们可以使用拦截器来实现这个需求,下面就让我来带领大家一起完成这个任务吧!

第一步:实现一个注解

首先,我们先实现一个注解,这个注解可以被加在方法上面,其主要功能如下:对于加上了这个注解的接口,会对其进行权限校验,通过才能执行下面的逻辑,否则会直接抛出异常。

package edu.szu.demo.annotation;import java.lang.annotation.*;@Target(ElementType.METHOD) // 作用于方法上@Retention(RetentionPolicy.RUNTIME) // 运行期保留@Inherited@Documentedpublic @interface Judge {    public boolean need() default true;}

实现接口

我们的接口逻辑很简单,对于传入的字符串参数,稍作修改便直接返回。而我们的接口使用了之前定义的 @Judge 注解,意味着该接口需要进行校验。

package edu.szu.demo.controller;import edu.szu.demo.annotation.Judge;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController {    /**     * 该方法对传入数据做一定的修改,然后将其返回     * @param judgePassword 通行密码,通过校验才放行     * @param name 传入的数据     * @return     */    @Judge    @RequestMapping("/test")    public String test(String judgePassword, String name) {        return name + " 已被修改";    }}

实现一个拦截器

实现拦截器比较简单,既可以实现接口 HandlerInterceptor ,也可以继承抽象类 HandlerInterceptorAdapter,在这一步博主选择了实现接口。

我们先来看看这个 HandlerInterceptor 接口是何方神圣。

public interface HandlerInterceptor {    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        return true;    }    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {    }    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {    }}
  1. preHandle:在业务处理器处理请求之前被调用,可用于编码、安全控制、权限校验

  2. postHandle:在业务处理器处理请求执行完成后,生成视图之前执行

  3. afterCompletion:在 DispatcherServlet 完全处理完请求后被调用,可用于清理资源

明白了 HandlerInterceptor 的构造,我们便可以使用这个接口了。我们定义一个拦截器,该拦截器对于带有 Judge 注解的请求,会进行判断,若密码不为 happy,会直接抛出异常,其余情况均会放行。

package edu.szu.demo.interceptor;import edu.szu.demo.annotation.Judge;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 TestInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        HandlerMethod handlerMethod = (HandlerMethod) handler;        //获取注解        Judge judge = handlerMethod.getMethod().getAnnotation(Judge.class);        if(judge != null && judge.need()) {            String getJudgePassword = request.getParameter("judgePassword");            //这里直接写死,密码必须设置为 happy            if(!getJudgePassword.equals("happy")) {                throw new Exception();            }        }        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {    }}

注册拦截器

然后把我们前面写好的拦截器注册一下

package edu.szu.demo.config;import edu.szu.demo.interceptor.TestInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebAppConfigurer implements WebMvcConfigurer {    @Override    public void addInterceptors(InterceptorRegistry registry) {        // 拦截所有请求地址        registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");    }}

这样子,我们的需求就已经实现了,接下来我们测试一下。

测试

在浏览器中我们输入以下 URL:

localhost:8080/test?judgePassword=happy&name=fdg

返回结果如下,可见对于添加了 @Judge 注解的接口,若 judgePassword 设置为 happy,拦截器会放行。

05cf3c5286052d36a9e768ce4557eeac.png然后我们在浏览器输入以下 URL:

http://localhost:8080/test?judgePassword=not&name=fdg

返回结果如下,可见对于添加了 @Judge 注解的接口,若 judgePassword 设置不为 happy,拦截器会抛出异常。

429e99d1e33e1a90df0a964b79d9965c.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/Geffin/article/details/108405165

0e5e20f7a0e4b2575fd9ca1d8ad2be8b.gif

9222f06a9ab49476bc84fc9ab53b51f8.gif

  • 新款SpringBoot在线教育平台开源了

  • 啃了这66套Java项目课程后,终于找到工作了!

  • 精品帖子大汇总

  • 牛逼plus,Spring Boot-Shiro-Vue权限系统(细粒度控制到按钮)

感谢点赞支持下哈 f71a24c7977a8233b402599d5ed66d71.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值