Interceptor拦截器的问题

来源:11-7 前后端登录拦截

无情慕

2020-05-18

@Slf4j
public class UserLoginInterceptor implements HandlerInterceptor {

    @Resource
    StringRedisTemplate stringRedisTemplate;

    /**
     * true 表示继续流程,false表示中断
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle...");
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            log.info("token为空,请求被拦截");
            throw new BusinessException("token为空,请求被拦截了");
        }

        String redisToken = null;
        try {
            redisToken = stringRedisTemplate.opsForValue().get(token);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (redisToken == null) {
            log.error("token无效, 请求被拦截");
            throw new BusinessException("token无效, 请求被拦截");
        } else {
            log.info("已登录: {}", redisToken);
        }
        return true;
    }
}

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    // TODO exclude路径在配置文件读取
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserLoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns( "/system/admin/user/login", "/system/admin/user/logout",
                        "/system/admin/kaptcha");
    }
}

图片描述

前端输出
图片描述

后端输出:

22.538 ERROR c.c.s.i.UserLoginInterceptor  :47   token无效, 请求被拦截

想用另一种方法实现用户拦截,这是我写的拦截器,在server模块,逻辑跟过滤器一样,从后端的返回值和日志看拦截像是成功了。
但是不知道为什么前端页面还是能读取到静态的资源。
Interceptor拦截器能不能代替过滤器?

写回答

1回答

甲蛙

2020-05-18

拦截器和过滤器都可以的。目的都是在业务代码之前拦截到,并做权限判断。

静态资源不会被拦截,你可以在vue的拦截器里增加判断(前端统一打印日志的地方),如果后端返回的是未登录,那么就跳转到登录页面

0
3
无情慕
非常感谢!
2020-05-18
共3条回复

Spring Cloud+ Vue前后端分离开发企业级在线视频系统

全网稀缺课程 市场热门项目+主流框架 一课掌握前后端技术

1743 学习 · 1697 问题

查看课程