作者:D之phper | 来源:互联网 | 2023-01-20 16:28
最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类
最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类,解决方法:重写一个类,模仿着SimpleByteSoure这个类,写个自己的类。并且实现序列化接口即可·。
1 package com.dzf.shiro;
2
3 import org.apache.shiro.codec.Base64;
4 import org.apache.shiro.codec.CodecSupport;
5 import org.apache.shiro.codec.Hex;
6 import org.apache.shiro.util.ByteSource;
7
8 import java.io.Serializable;
9 import java.util.Arrays;
10
11 /**
12 *
13 * 为了解决redis序列化的问题,SimpleByteSource没有实现序列化接口
14 * 在传入simpleAuthenticationInfo()的时候,缓存用户信息会出现序列化异常
15 *
16 * @author dingzf
17 * @date 2018/3/7
18 * @time 21:54
19 */
20 public class ShiroByteSource implements ByteSource, Serializable {
21 private static final long serialVersiOnUID= -6814382603612799610L;
22 private volatile byte[] bytes;
23 private String cachedHex;
24 private String cachedBase64;
25
26 public ShiroByteSource() {
27
28 }
29
30 public ShiroByteSource(String string) {
31 this.bytes = CodecSupport.toBytes(string);
32 }
33
34 public void setBytes(byte[] bytes) {
35 this.bytes = bytes;
36 }
37
38 @Override
39 public byte[] getBytes() {
40 return this.bytes;
41 }
42
43 @Override
44 public String toHex() {
45 if ( this.cachedHex == null ) {
46 this.cachedHex = Hex.encodeToString(getBytes());
47 }
48 return this.cachedHex;
49 }
50
51 @Override
52 public String toBase64() {
53 if ( this.cachedBase64 == null ) {
54 this.cachedBase64 = Base64.encodeToString(getBytes());
55 }
56 return this.cachedBase64;
57 }
58
59 @Override
60 public boolean isEmpty() {
61 return this.bytes == null || this.bytes.length == 0;
62 }
63
64 @Override
65 public String toString() {
66 return toBase64();
67 }
68
69 @Override
70 public int hashCode() {
71 if (this.bytes == null || this.bytes.length == 0) {
72 return 0;
73 }
74 return Arrays.hashCode(this.bytes);
75 }
76
77 @Override
78 public boolean equals(Object o) {
79 if (o == this) {
80 return true;
81 }
82 if (o instanceof ByteSource) {
83 ByteSource bs = (ByteSource) o;
84 return Arrays.equals(getBytes(), bs.getBytes());
85 }
86 return false;
87 }
88
89 public static ByteSource of(String string) {
90 return new ShiroByteSource(string);
91 }
92 }
在自己的实现的realm里面调用如下:
1 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), new ShiroByteSource(user.getSalt()), getName());
以前的写法是:
1 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), new SimpleByteSource(user.getSalt()), getName());
然后就可以解决问题了。