spring+springmvc+Interceptor+jwt+redis实现sso单点登录

本文介绍了如何在分布式环境中利用Spring的Interceptor、jwt令牌和Redis实现SSO单点登录。步骤包括:1. 引入jwt相关依赖;2. 配置拦截器;3. 创建jwt加密解密工具类;4. 设计Login和RedisLogin对象;5. 实现LoginInterceptor拦截器;6. 定义异常枚举LoginResponseCode;7. 编写登录接口;8. 进行测试。整个流程详细地展示了SSO的实现过程。
摘要由CSDN通过智能技术生成


在分布式环境中,如何支持PC、APP(ios、android)等多端的会话共享,这也是所有公司都需要的解决方案,用传统的session方式来解决,我想已经out了,我们是否可以找一个通用的方案,比如用传统cas来实现多系统之间的sso单点登录或使用oauth的第三方登录方案? 今天给大家简单讲解一下使用spring拦截器Interceptor机制、jwt认证方式、redis分布式缓存实现sso单点登录,闲话少说,直接把步骤记录下来分享给大家:

1. 引入jwt的相关jar包,在项目pom.xml中引入:

 

Java代码 复制代码  收藏代码
  1. <dependency>  
  2.             <groupId>com.auth0</groupId>  
  3.             <artifactId>java-jwt</artifactId>  
  4.             <version>2.2.0</version>  
  5. </dependency>  
<dependency>
		    <groupId>com.auth0</groupId>
		    <artifactId>java-jwt</artifactId>
		    <version>2.2.0</version>
</dependency>

 

 

2. 拦截器配置:

 

Java代码 复制代码  收藏代码
  1. <mvc:interceptor>  
  2.             <mvc:mapping path="${adminPath}/**" />  
  3.             <mvc:exclude-mapping path="${adminPath}/rest/login"/>  
  4.             <bean class="com.ml.honghu.interceptor.LoginInterceptor" />  
  5. </mvc:interceptor>  
<mvc:interceptor>
			<mvc:mapping path="${adminPath}/**" />
			<mvc:exclude-mapping path="${adminPath}/rest/login"/>
			<bean class="com.ml.honghu.interceptor.LoginInterceptor" />
</mvc:interceptor>

 我这里简单配置了要拦截的url和过滤的url(这个根据自己项目来定)

 

 

3. 编写jwt的加密或者解密工具类:

 

Java代码 复制代码  收藏代码
  1. public class JWT {  
  2.     private static final String SECRET = "HONGHUJWT1234567890QWERTYUIOPASDFGHJKLZXCVBNM";  
  3.   
  4.     private static final String EXP = "exp";  
  5.   
  6.     private static final String PAYLOAD = "payload";  
  7.   
  8.     //加密  
  9.     public static <T> String sign(T object, long maxAge) {  
  10.         try {  
  11.             final JWTSigner signer = new JWTSigner(SECRET);  
  12.             final Map<String, Object> claims = new HashMap<String, Object>();  
  13.             ObjectMapper mapper = new ObjectMapper();  
  14.             String jsonString = mapper.writeValueAsString(object);  
  15.             claims.put(PAYLOAD, jsonString);  
  16.             claims.put(EXP, System.currentTimeMillis() + maxAge);  
  17.             return signer.sign(claims);  
  18.         } catch(Exception e) {  
  19.             return null;  
  20.         }  
  21.     }  
  22.   
  23.     //解密  
  24.     public static<T> T unsign(String jwt, Class<T> classT) {  
  25.         final JWTVerifier verifier = new JWTVerifier(SECRET);  
  26.         try {  
  27.             final Map<String,Object> claims= verifier.verify(jwt);  
  28.             if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {  
  29.                   String json = (String)claims.get(PAYLOAD);  
  30.                   ObjectMapper objectMapper = new ObjectMapper();  
  31.                   return objectMapper.readValue(json, classT);  
  32.   
  33.             }  
  34.             return null;  
  35.         } catch (Exception e) {  
  36.             return null;  
  37.         }  
  38.     }  
  39. }  
public class JWT {
	private static final String SECRET = "HONGHUJWT1234567890QWERTYUIOPASDFGHJKLZXCVBNM";

    private static final String EXP = "exp";

    private static final String PAYLOAD = "payload";

    //加密
    public static <T> String sign(T object, long maxAge) {
        try {
            final JWTSigner signer = new JWTSigner(SECRET);
            final Map<String, Object> claims = new HashMap<String, Object>();
            ObjectMapper mapper = new ObjectMapper();
            String jsonString = mapper.writeValueAsString(object);
            claims.put(PAYLOAD, jsonString);
            claims.put(EXP, System.currentTimeMillis() + maxAge);
            return signer.sign(claims);
        } catch(Exception e) {
            return null;
        }
    }

    //解密
    public static<T> T unsign(String jwt, Class<T> classT) {
        final JWTVerifier verifier = new JWTVerifier(SECRET);
        try {
            final Map<String,Object> claims= verifier.verify(jwt);
            if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {
                  String json = (String)claims.get(PAYLOAD);
      
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值