前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springBoot+redis实现登入拦截器--系统框架搭建(二)

springBoot+redis实现登入拦截器--系统框架搭建(二)

作者头像
用户9919783
发布2022-07-26 11:34:53
5320
发布2022-07-26 11:34:53
举报
文章被收录于专栏:后端从入门到精通

环境需求:redis3.8.2+maven+springBoot+jdk1.8模板

1、需求背景

周末在家,上家同事突然联系,让我给他网站,于是自己先梳理逻辑,实现功能并且记录下来。

这篇文章主要在上篇文章的基础上,实现登入拦截,保证用户在必须在登入的情况下,才能任意访问网站,因为上篇文章做SSO单点登入时,我们已经把用户信息存入redis,所以在拦截登入的时候,直接在redis里面取用户信息,判断用户是否登入过系统,用于拦截。

对redis实现系统单点登入功能感兴趣的同学,可以点进去看看:

Redis实现Single单点登入--系统框架搭建(一)

2、功能实现演示

1、需要自己定义的配置类实现WebMvcConfigurer,

2、在方法preHandler里在每次访问接口前判断是否用户已登入,若redis存在用户信息,则返回true,业务继续进行,若未登入,返回false,并且用response跳转到登入页面,

那么登入页面的url从哪来呢,用request获取项目的虚拟路径,后面需要跳转的首页路径自己拼接。

3、拦截全部接口,那怎么能访问首页呢,所以要配置登入页面白名单,还有需要加载的js,css,png都配置成白名单。

当上面的全部实现后,就能看到,不论登入什么接口,都会跳转到system1当前接口来,想要实现这个功能,登入之后,就能任意访问。

3、代码详解

代码语言:javascript
复制
@Configuration
@Slf4j
public class LoginConfiguration implements WebMvcConfigurer {
 
    @Resource
    private RedisTemplate redisTemplate;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
                 log.info("登入拦截器启动!!");
                log.info("session是否存在:{}", request.getSession().getAttribute("name"));
                if (request.getSession().getAttribute("name") != null) {
                    redisTemplate.opsForValue().set("name", request.getSession().getAttribute("name"), 10,TimeUnit.SECONDS);
                    return true;
                }
                log.info("request.getContextPath():{}", request.getContextPath());
                response.sendRedirect(request.getContextPath() + "/redis/single/system1");
                //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
                //如果设置为true时,请求将会继续执行后面的操作
                return false;
            }
 
            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
                log.info("postHandle");
            }
 
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                Exception ex) throws Exception {
                log.info("afterCompletion");
            }
        });
        //所有路径都被拦截
        interceptorRegistration.addPathPatterns("/**");
        //添加不拦截路径
        interceptorRegistration.excludePathPatterns(
            //"/redis/single/login_page",
            "/redis/single/system1",
            "/redis/single/system2",
            "/redis/single/detection",
            "/**/*.html",
            "/**/*.js",
            "/**/*.css",
            "/**/*.woff",
            "/**/*.ttf"
        );
 
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档