单点登录系统实现

单点登录系统实现基于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的单点登录系统就结束了,有什么不对的地方请指出。

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

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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171226A108P800?refer=cp_1026

扫码关注云+社区