shiro使用redis缓存时,出现NotSerializable异常

出现这种情况是因为:SimpleByteSource没有是实现Serializable接口

解决办法:自定义一个类继承SimpleByteSource实现Serializable接口

自定义一个SimpleByteSource 类继承继承SimpleByteSource实现Serializable接口。

import java.io.Serializable;
 
public class SimpleByteSource extends org.apache.shiro.util.SimpleByteSource
implements Serializable{
 
	private static final long serialVersionUID = 5528101080905698238L;
 
	public SimpleByteSource(byte[] bytes) {
		super(bytes);
		// TODO 自动生成的构造函数存根
	}
 
}

然后创建工具类ByteSourceUtils

import org.apache.shiro.util.ByteSource;
 
public class ByteSourceUtils{
	public static ByteSource bytes(byte[] bytes){
		return new SimpleByteSource(bytes);
	}
	public static ByteSource bytes(String arg0){
		return new SimpleByteSource(arg0.getBytes());
	}
}

使用自定义的byteSourceUtil

SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(  
                user.getUsername(), //用户名  
                user.getPassword(), //密码  
                ByteSourceUtils.bytes(user.getSalt()),//salt
                getName()  //realm name  
        );  

当然也可以实现ByteSource接口和Serializable接口,但是实现ByteSource接口需要实现其方法

package com.example.demo.utils;

import org.apache.shiro.codec.Base64;
import org.apache.shiro.codec.CodecSupport;
import org.apache.shiro.codec.Hex;
import org.apache.shiro.util.ByteSource;

import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Arrays;

/**
 * @ClassName MySimpleByteSource
 * @Description 解决Shiro使用redis缓存时,出现NotSerializableException
 * @Author uuorb
 * @Date 2021/4/26 3:52 上午
 * @Version 0.1
 **/

public class MySimpleByteSource implements ByteSource, Serializable {
  private static final long serialVersionUID = 5175082362119580768L;

  private  byte[] bytes;
  private String cachedHex;
  private String cachedBase64;

  public MySimpleByteSource(){
  }

  public MySimpleByteSource(byte[] bytes) {
    this.bytes = bytes;
  }

  public MySimpleByteSource(char[] chars) {
    this.bytes = CodecSupport.toBytes(chars);
  }

  public MySimpleByteSource(String string) {
    this.bytes = CodecSupport.toBytes(string);
  }

  public MySimpleByteSource(ByteSource source) {
    this.bytes = source.getBytes();
  }

  public MySimpleByteSource(File file) {
    this.bytes = (new MySimpleByteSource.BytesHelper()).getBytes(file);
  }

  public MySimpleByteSource(InputStream stream) {
    this.bytes = (new MySimpleByteSource.BytesHelper()).getBytes(stream);
  }

  public static boolean isCompatible(Object o) {
    return o instanceof byte[] || o instanceof char[] || o instanceof String || o instanceof ByteSource || o instanceof File || o instanceof InputStream;
  }

  public void setBytes(byte[] bytes) {
    this.bytes = bytes;
  }

  @Override
  public byte[] getBytes() {
    return this.bytes;
  }


  @Override
  public String toHex() {
    if(this.cachedHex == null) {
      this.cachedHex = Hex.encodeToString(this.getBytes());
    }
    return this.cachedHex;
  }

  @Override
  public String toBase64() {
    if(this.cachedBase64 == null) {
      this.cachedBase64 = Base64.encodeToString(this.getBytes());
    }

    return this.cachedBase64;
  }

  @Override
  public boolean isEmpty() {
    return this.bytes == null || this.bytes.length == 0;
  }
  @Override
  public String toString() {
    return this.toBase64();
  }

  @Override
  public int hashCode() {
    return this.bytes != null && this.bytes.length != 0? Arrays.hashCode(this.bytes):0;
  }

  @Override
  public boolean equals(Object o) {
    if(o == this) {
      return true;
    } else if(o instanceof ByteSource) {
      ByteSource bs = (ByteSource)o;
      return Arrays.equals(this.getBytes(), bs.getBytes());
    } else {
      return false;
    }
  }

  private static final class BytesHelper extends CodecSupport {
    private BytesHelper() {
    }

    public byte[] getBytes(File file) {
      return this.toBytes(file);
    }

    public byte[] getBytes(InputStream stream) {
      return this.toBytes(stream);
    }
  }

}

使用的时候用自己的byteSource

        SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(token,token, new MySimpleByteSource(user.getSalt()),getName());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值