如何在SpringBoot2.0+版本中,写个拦截器?

本文介绍了一种利用Token进行接口调用验证的方法,通过在用户登录时生成随机码并存入Redis,前端调用接口时需携带此Token,后端通过自定义拦截器检查Token的有效性,确保接口调用者的合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:出于对接口的安全性的考虑,调用接口需要前端携带token值,以验证用户的合法性,如果用户合法,则允许用户调用接口,反之则禁止用户随意调用接口。

前提条件:这里的token值,是由用户登录时产生的随机码,当用户登录时,我们把生成token值和用户的信息,以key-value的形式存入redis,这样当前端调后端接口的时候,在请求头带上这个token值,我们就可以在后端写个拦截器,来校验用户的合法性了。

下面上代码:

只需要写红色框框中的两个类即可:

import com.pactera.config.intercepors.LoginInterceptor;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author xiwen
 * @date 2020年6月1日
 */
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    /**
     * 这个方法是用来配置静态资源的,比如html,js,css,等等
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    /**
     * 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") //表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") //表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        //(/**)==拦截所有请求
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/pbms/sso/login", "/register")
                .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
        //较新Spring Boot的版本中这里可以直接去掉,否则会报错
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

WebConfigurer :这个类中放开了swagger的访问,方便前后端联调

import com.sun.istack.Nullable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/**
 * @author xiwen
 * @date 2020年6月1日
 */
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String user = "";
        try {
            String token = request.getHeader("X-Token");
            if (token == null) {
                token = "";
            }
            user = redisTemplate.opsForValue().get(token);
        } catch (Exception e) {
            log.error("拦截器异常!" + e);
            e.printStackTrace();
        }
        log.info("拦截状态===" + (user != null));
        log.info("拦截请求===" + request.getRequestURI());
        return user != null;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) {
    }
}

LoginInterceptor:这个类是你自定义的拦截器,在preHandle()方法中你可以自定义拦截的条件,达到你所要拦截的目的。返回值是个布尔值,true表示不拦截,false表示拦截。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

希文先森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值