专栏首页编程单点登录系统实现

单点登录系统实现

单点登录系统实现基于SpringBoot

今天的干货有点湿,里面夹杂着我的泪水。可能也只有代码才能让我暂时的平静。通过本章内容你将学到单点登录系统和传统登录系统的区别,单点登录系统设计思路,Spring4 Java配置方式整合HttpClient,整合SolrJ ,HttpClient简易教程。还在等什么?撸起袖子开始干吧!

效果图:8081端口是sso系统,其他两个8082和8083端口模拟两个系统。登录成功后检查Redis数据库中是否有值。

技术:SpringBoot,SpringMVC,Spring,SpringData,Redis,HttpClient

说明:本章的用户登录注册的代码部分已经在SpringBoot基础入门中介绍过了,这里不会重复贴代码。

源码:见文章底部

SpringBoot基础入门:http://www.cnblogs.com/itdragon/p/8047132.html

单点登录系统简介

在传统的系统,或者是只有一个服务器的系统中。Session在一个服务器中,各个模块都可以直接获取,只需登录一次就进入各个模块。若在服务器集群或者是分布式系统架构中,每个服务器之间的Session并不是共享的,这会出现每个模块都要登录的情况。这时候需要通过单点登录系统(Single Sign On)将用户信息存在Redis数据库中实现Session共享的效果。从而实现一次登录就可以访问所有相互信任的应用系统。

单点登录系统实现

Maven项目核心配置文件 pom.xml 需要在原来的基础上添加 httpclient和jedis jar包

Spring4 Java配置方式

这里,我们需要整合httpclient用于各服务之间的通讯(也可以用okhttp)。同时还需要整合redis用于存储用户信息(Session共享)。在Spring3.x之前,一般在应用的基本配置用xml,比如数据源、资源文件等。业务开发用注解,比如Component,Service,Controller等。其实在Spring3.x的时候就已经提供了Java配置方式。现在的Spring4.x和SpringBoot都开始推荐使用Java配置方式配置bean。它可以使bean的结构更加的清晰。

整合 HttpClient

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient4.5系列教程 : http://blog.csdn.net/column/details/httpclient.html

首先在src/main/resources 目录下创建 httpclient.properties 配置文件

然后在 src/main/java/com/itdragon/config 目录下创建 HttpclientSpringConfig.java 文件

这里用到了四个很重要的注解

@Configuration:作用于类上,指明该类就相当于一个xml配置文件

@Bean:作用于方法上,指明该方法相当于xml配置中的,注意方法名的命名规范

@PropertySource:指定读取的配置文件,引入多个value={"xxx:xxx","xxx:xxx"},ignoreResourceNotFound=true 文件不存在是忽略

@Value:获取配置文件的值,该注解还有很多语法知识,这里暂时不扩展开

整合 Redis

SpringBoot官方其实提供了spring-boot-starter-redis pom 帮助我们快速开发,但我们也可以自定义配置,这样可以更方便地掌控。

Redis 系列教程 : http://www.cnblogs.com/itdragon/category/1122427.html

首先在src/main/resources 目录下创建 redis.properties 配置文件

设置Redis主机的ip地址和端口号,和存入Redis数据库中的key以及存活时间。这里为了方便测试,存活时间设置的比较小。这里的配置是单例Redis。

在src/main/java/com/itdragon/config 目录下创建 RedisSpringConfig.java 文件

Service 层

在src/main/java/com/itdragon/service 目录下创建 UserService.java 文件,它负责三件事情第一件事件:验证用户信息是否正确,并将登录成功的用户信息保存到Redis数据库中。第二件事件:负责判断用户令牌是否过期,若没有则刷新令牌存活时间。第三件事件:负责从Redis数据库中删除用户信息。这里用到了一些工具类,不影响学习,可以从源码中直接获取。

Controller 层

负责跳转登录页面跳转

负责用户的登录,退出,获取令牌的操作

视图层

一个简单的登录页面

HttpClient 基础语法

这里封装了get,post请求的方法

Spring 自定义拦截器

这里是另外一个项目 itdragon-service-test-sso 中的代码,首先在src/main/resources/spring/springmvc.xml 中配置拦截器,设置那些请求需要拦截

然后在 src/main/java/com/itdragon/interceptors 目录下创建 UserLoginHandlerInterceptor.java 文件

可能存在的问题SpringData 自动更新问题

SpringData 是基于Hibernate的。当User 已经是持久化对象,被保存在session缓存当中。若User又重新修改属性值,在提交事务时,此时hibernate对象就会拿当前这个User对象和保存在session缓存中的User对象进行比较,如果两个对象相同,则不会发送update语句,否则,会发出update语句。笔者采用比较傻的方法,就是在提交事务之前把数据还原。各位如果有更好的办法请告知,谢谢!参考博客:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html

检查用户信息是否保存

登录成功后,进入Redis客户端查看用户信息是否保存成功。同时为了方便测试,也可以删除这个key。

总结

1 单点登录系统通过将用户信息放在Redis数据库中实现共享Session效果。2 Java 配置方式使用四个注解 @Configuration @Bean @PropertySource @Value 。3 Spring 拦截器的设置。4 HttpClient 的使用5 祝大家圣诞节快乐

源码:https://github.com/ITDragonBlog/daydayup/tree/master/SpringBoot/SSO

到这里,基于SpringBoot的单点登录系统就结束了,有什么不对的地方请指出。

觉得本文对你有帮助?请分享给更多人。

关注「程序员宝库」公众号,直接获取各种编程资料!

本文来自企鹅号 - 程序员宝库媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Redis走进误区,该怎么办?

    首先是一个产品线开发人员搭建起了一套庞大的价格存储系统,底层是关系型数据库,只用来处理一些事务性的操作和存放一些基础数据; 在关系型数据库的上面还有一套Mong...

    企鹅号小编
  • 成为好程序员必须避免的5个坏习惯

    当你开始成为一个程序员的时候,在编程的时候很容易陷入下面所述的一些坏习惯。 作为一名程序员,犯错误不可避免,这是你学习编程课程中的一部分。在你的职业生涯中你会犯...

    企鹅号小编
  • 《小白H5成长之路28》用CSS3和jQuery实现简单的右下角弹窗

    “小白,我们接着说CSS3动画的事情吧!今天上午你了解了一下关键帧keyframes,已经可以实现一些打开页面后自动执行的动画效果,现在我们试试通过jQuery...

    企鹅号小编
  • 这个Jedis的坑你肯定没踩过!记一次深坑排查过程

    上周四晚上,月黑风高Coding夜,在公司的角落里,埋头研究研究webflux,组里的同事小D过来说碰到一个诡异的Redis的问题:

    用户1516716
  • 0811-7.1.3-如何使用Ranger给HDFS授权

    使用admin用户登录http://cdp02.fayson.com:6080 页面,点击cm_hdfs 进入该页面

    Fayson
  • matplotlib 3D 绘图(二)

    用户6021899
  • Oracle学习笔记四

    在写java程序中有集合的概念,那么在pl/sq中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。

    Kevin_Zhang
  • Windows下SLmail邮件服务器缓冲区溢出理解及实验

    本次缓冲区溢出实验是在Windows7 Unlimit 64位下的SLmail邮件服务溢出测试。 注:SLmail并不是一个特别常用的邮件服务应用,本次实验仅限...

    FB客服
  • Cypress系列(37)- location() 命令详解

    https://www.cnblogs.com/poloyy/category/1768839.html

    小菠萝测试笔记
  • 一不小心肝出了4W字的Redis面试教程

    Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库、缓存、消息中间件,这么优秀的东西客定要一点一点的吃透它。

    黄泽杰

扫码关注云+社区

领取腾讯云代金券