首页 > 其他分享 >springboot使用拦截器实现登录拦截

springboot使用拦截器实现登录拦截

时间:2023-11-20 12:11:35浏览次数:34  
标签:拦截器 springboot 自定义 request token 拦截 userLoginVo redisTemplate

参考文档

https://blog.csdn.net/qq_50652600/article/details/127250413

HandlerInterceptor

作用:自定义拦截器

如何创建:这个接口我们通常会自定义一个类。加上@Component注解,并且使它实现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:此方法的作用是在请求进入到Controller进行拦截,有返回值。(返回true则将请求放行进入Controller控制层,false则请求结束返回错误信息)
    • 用法:登录验证(判断用户是否登录)权限验证:判断用户是否有权访问资源(校验token)
  2. postHandle:该方法是在Controller控制器执行完成但是还没有返回模板进行渲染拦截。没有返回值。就是Controller----->拦截------>ModelAndView。
    • 用法:因此我们可以将Controller层返回来的参数进行一些修改,它就包含在ModelAndView中,所以该方法多了一个ModelAndView参数。
  3. afterCompletion:该方法是在ModelAndView返回给前端渲染后执行。
    • 用法:例如登录的时候,我们经常把用户信息放到ThreadLocal中,为了防止内存泄漏,就需要将其remove掉,该操作就是在这里执行的。

使用方法

1、创建自定义拦截器,实现HandlerInterceptor接口,这里以登陆拦截器为例

/**
 * @Author:tzl
 * @Date:2023/11/20 11:24
 */
@Slf4j
public class UserLoginInterceptor implements HandlerInterceptor {

    private RedisTemplate redisTemplate;

    public UserLoginInterceptor(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // .... 添加你的操作
        this.initUserLoginVo(request);
        return true;
    }

    private void initUserLoginVo(HttpServletRequest request) {
        // 1、从请求头获取到token
        String token = request.getHeader("token");
        log.info("token:{}", token);
        // 2、取出token中的userId
        if (StringUtils.isNotBlank(token)) {
            Long userId = JwtHelper.getUserId(token);
            // 3、通过userId从redis中取出user
            UserLoginVo userLoginVo = (UserLoginVo) redisTemplate.opsForValue().get(RedisConst.USER_LOGIN_KEY_PREFIX + userId);
            if (userLoginVo != null) {
                // 4、将值都存入ThreadLocal中
                AuthContextHolder.setUserId(userLoginVo.getUserId());
                AuthContextHolder.setWareId(userLoginVo.getWareId());
                AuthContextHolder.setUserLoginVo(userLoginVo);
            }
        }
    }

}

2、 将自定义拦截器加入到配置中,配置需要继承WebMvcConfigurationSupport

/**
 * @Author:tzl
 * @Date:2023/11/20 11:43
 */
@Configuration
public class LoginMvcConfigurerAdapter extends WebMvcConfigurationSupport {

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 添加自定义拦截器,设置路径
        registry.addInterceptor(new UserLoginInterceptor(redisTemplate))
                // 拦截小程序请求
                .addPathPatterns("/api/**")
                // 排除登陆请求
                .excludePathPatterns("/api/user/weixin/wxLogin/*");
        super.addInterceptors(registry);
    }
}

标签:拦截器,springboot,自定义,request,token,拦截,userLoginVo,redisTemplate
From: https://www.cnblogs.com/yaya-sama/p/17843644.html

相关文章

  • SpringBoot 策略模式 切换上传文件模式
    策略模式策略模式是指有一定行动内容的相对稳定的策略名称。我们定义一个接口(就比如接下来要实现的文件上传接口)我们定义所需要实现的策略实现类A、B、C、D(也就是项目中所使用的四种策略阿里云Oss上传、腾讯云Cos上传、七牛云Kodo上传、本地上传)我们通过策略上下文来调用策......
  • springboot 控制序列化反序列化示例(接口返回数据处理/接口接收数据处理)
    1.返回Long转JSONpackagecom.mingx.drone.config;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializerProvider;importjava.io.IOException;/***@Descript......
  • 新建springboot项目,访问前端界面
    直接在IDEA中下载依赖会比较慢,将常用依赖下载到本地,然后从本地加载依赖会比较快。(方法可以搜,很多) pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quo......
  • springboot3+vue3大事件的展示
    跟着黑马老师,做了一遍收获很大 ......
  • springboot解决跨域问题
    当看这个的时候应该就是遇到跨域问题了,下面是解决的代码`@ConfigurationpublicclassCorsConfig{//当前跨域请求最大有效时长。这里默认1天privatestaticfinallongMAX_AGE=24*60*60;@BeanpublicCorsFiltercorsFilter(){UrlBasedCorsConfigurationSo......
  • Spring拦截器(Interceptor)的使用
    一.注册拦截器,定义一个类实现HandlerInterceptor接口,重写里面的三个方法,具体代码实现如下:packagecom.luoluo.interceptor;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.se......
  • springboot在线人数统计
    在线人数统计笔者做了一个网站,需要统计在线人数。在线有两种:一、如果是后台系统如果登录算在线,退出的时候或者cookie、token失效的时候就算下线二、如果是网站前台,访问的时候就算在线今天我们来讲一下第2种情况,网站前台如何统计同时在线人数1、首先创建一个在线人数管理类......
  • axios向后台springboot服务器发送请求时出现的错误
    this.$axios.post("http://localhost:8080/changeExamStatus?billID="+this.tableData[index].billID).then((response)=>{if(response.data.code==1){alert("第"+(index+1)+"项申请单审核成功");}......
  • springboot引入本地jar包
    1.在resources目录下新建lib目录,将jar放入2.在pom文件中添加依赖<dependency><groupId>com.fanruan</groupId><artifactId>fine-accumulator</artifactId><version>11.0</version><scope>system</scope><......
  • C:\Users\17482\Desktop\ERP——test1\SpringBoot-ERP-master\src\main\java
    这个错误表明在你的Java类文件UserImp.java中,找不到MyBatis的注解包org.apache.ibatis.annotations。这个包中包含了MyBatis的注解,比如@Select、@Insert等。首先,请确保你的项目正确引入了MyBatis的依赖。在你的pom.xml文件中应该包含类似以下的依赖配置:<dependency......