美文网首页
shiro使用redis缓存时,出现NotSerializabl

shiro使用redis缓存时,出现NotSerializabl

作者: 优优我心喵 | 来源:发表于2021-04-26 04:01 被阅读0次
     /*
        CustomRealm.java
        认证
       */
      @Override
      protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String principal = (String) token.getPrincipal();
        UserService userService = (UserService) ApplicationUtils.getBeanByName("userService");
        User user = userService.findUser(principal);
        System.out.println(user.toString());
        /*
          旧代码会抛出NotSerializableException:org异常,替换成下面代码就可以了
          [OLD] ByteSource salt = ByteSource.Util.bytes(user.getSalt());
          [NEW] MySimpleByteSource salt = new MySimpleByteSource(user.getSalt());
        */
    
        if (!ObjectUtils.isEmpty(user)){
          MySimpleByteSource salt = new MySimpleByteSource(user.getSalt());
          return new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(), salt ,this.getName());
        }
        return null;
      }
    
    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);
        }
      }
    
    }
    
    

    相关文章

      网友评论

          本文标题:shiro使用redis缓存时,出现NotSerializabl

          本文链接:https://www.haomeiwen.com/subject/mllsrltx.html