马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
SpringBoot前背景分离项目利用Redis实现SSO单点登录
接纳web集群举行的服务设置,可以得到较好的处理惩罚性能,同时也可以包管高可用的机制,但是有一个最关键性的标题就是在于Session共享与分配,从早期的开发来讲,Session共享是在tomcat中设置的(Tomcat提供了一个扩展的支持)。
一、单点登录(SSO)
1、单点登录(SSO)是什么
单点登录(SSO,Single Sign On),是在企业内部多个应用体系(如考勤体系、财政体系、人事体系等)场景下,用户只须要登录一次,就可以访问多个应用体系。
同理用户只需注销一次,就可以从多个应用体系退出登录。
简单来说就是,一次登录,全部登录!一次注销,全部注销!!
2、单点登录的实现原理
单点登录的实现原理阐明如下:
- 用户初次访问体系A时,须要举行登录。
- 体系A带着用户登录信息重定向给认证体系。
- 认证体系验证用户登录信息。
- 验证通过后,返回一个token(Tip:token类似一种内部的通行证,包罗了用户身份信息、登录状态和逾期时间,在各个体系间共享。)
- 认证体系带着token重定向给体系A,得知用户是已登录状态。
- 体系A向用户返回哀求的资源。
- 用户访问体系B时,须要举行登录。
- 体系B通过共享的token,得知用户是已登录状态。
- 体系B向用户返回哀求的资源。
Token是偶然效性的,假如用户长时间没有操纵,token将会逾期。
Token逾期后用户再次访问体系A、体系B时,登录状态已失效,须要重新登录。
对于注销场景,与上述流程类似。
用户自动从体系A注销时,体系A调用认证体系,打扫token。
此时用户再访问体系A、体系B时,通过共享的token得知用户是已注销状态,须要重新登录。
二、Springboot的拦截器和过滤器的区别
Spring Boot中的拦截器(Interceptor)和过滤器(Filter)是用来在哀求处理惩罚之前或之后举行一些特别处理惩罚的工具。它们的告急区别如下:
- 实现机制差别:Filter 是基于 Servlet 规范实现的,而 Interceptor 是基于 Spring MVC 框架实现的。
- 拦截范围差别:Filter 可以拦截全部的哀求,而 Interceptor 只能拦截由 DispatcherServlet 处理惩罚的哀求。
- 拦截次序差别:Filter 在 Interceptor 之前调用,而且在全部的拦截器(Interceptor)之后调用。
- 拦截方法差别:Filter 实现了 javax.servlet.Filter 接口,此中有两个告急方法:init() 和 destroy()。Interceptor 实现了 Spring 的 HandlerInterceptor 接口,此中有三个告急方法:preHandle()、postHandle() 和afterCompletion()。
过滤器示例代码:
- import javax.servlet.*;
- import javax.servlet.http.HttpServletRequest;
- import java.io.IOException;
- public class MyFilter implements Filter {
-
-
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
-
-
- // 初始化代码
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-
-
- HttpServletRequest req = (HttpServletRequest) request;
- // 在请求处理之前可以进行一些处理
- System.out.println("Filter before processing the request: " + req.getRequestURI());
- chain.doFilter(request, response); // 传递给下一个过滤器或servlet处理
- // 在请求处理之后可以进行一些处理
- System.out.println("Filter after processing the request: " + req.getRequestURI());
- }
-
- @Override
- public void destroy() {
-
-
- // 销毁代码
- }
- }
复制代码 注册过滤器
注册过滤器,可以利用@WebFilter注解大概在设置类中用@Bean注解注册。
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class FilterConfig {
-
-
- @Bean
- public FilterRegistrationBean<MyFilter> myFilter() {
-
-
- FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new MyFilter());
- registrationBean.addUrlPatterns("/*");
- registrationBean.setOrder(1);
- return registrationBean;
- }
- }
复制代码 三、SpringBoot利用redis实现单点登录
在Spring Boot中利用拦截器来用户是否登录:
1、登录状态可以生存在redis中
2、创建一个自界说拦截器,在此中查抄哀求中的登录根据是否有效。
以下是一个简单的示例:
创建名称为sso-demo的springboot项目
1、pom.xml依靠设置
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.22</version> <!-- 请使用最新的版本号 -->
- </depende
复制代码 |