由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

SpringBoot定义拦截器

JAVA 西门飞冰 36℃
[隐藏]

1.介绍

SpringBoot拦截器,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

2.示例场景说明

示例场景:在SpringBoot中自定义一个拦截器,判断用户的请求中是否携带了token,要是用户请求携带了token则让用户执行Controller方法,否则直接在拦截器拒绝用户请求。

image-20221120155202955

3.代码示例

自定义拦截器HandlerInterceptor 接口是必须实现的,它里面提供了三个方法:

preHandle:进入Controller之前对请求进行前置处理。方法返回为true,会被spring向后传递给其他拦截器或者被后续Controller处理,返回为false,则请求到当前拦截器就终止了,不会向后进行传递

postHandle:请求被处理以后要做什么事情,Controller中抛出异常就不会执行

afterCompletion:数据被渲染以后执行,在前后端分离架构中一般不用

第一步:实现HandlerInterceptor接口,实现拦截器业务逻辑

public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      	// 强制要求用户请求头中有一个token的字符串
        String token = request.getHeader("token");
        if(token != null){
          	// token存在处理逻辑
            System.out.println("发现Token:" + token + ",准备用户身份校验");
            System.out.println("用户身份校验通过");
            return true;
        }else{
          	// token不存在处理逻辑
            ObjectMapper objectMapper = new ObjectMapper();
            Map result = new LinkedHashMap();
            result.put("code", "500");
            result.put("message", "请求未包含Token,用户校验失败");
            String json = objectMapper.writeValueAsString(result);
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().println(json);
            return false;
        }

    }
}

第二步:创建应用程序配置类,实现WebMvcConfigurer对拦截器进行定义

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler, Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc 配置,需要创建一个配置类并实现WebMvcConfigurer 接口;

// @Configuration 注解,通过java类的形式,替换原有的xml配置文件
@Configuration
public class SpringWebConfiguration implements WebMvcConfigurer {
    // addInterceptors方法对系统中的拦截器进行配置的
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // registry 表示添加全新的拦截器,这里将刚才判断token的拦截器加入
        InterceptorRegistration registration = registry.addInterceptor(new TokenInterceptor());
        // 拦截器拦截的请求URL地址
        registration.addPathPatterns("/na/**");
        // 不进行拦截的URL地址,排除多个地址,可以通过String 数组的形式传入
        registration.excludePathPatterns(new String[]{"/img/**", "/static/**"});
    }
}

要是配置了多个拦截器,则根据拦截器添加的顺序进行拦截

4.测试验证

没添加token访问,用户请求失败

image-20221120154804179

添加token访问,用户请求成功

image-20221120154442494

转载请注明:西门飞冰的博客 » SpringBoot定义拦截器

喜欢 (4)or分享 (0)