在实现RememberMe时遇到如下错误
2019-06-24 15:37:49.620 WARN 12952 --- [nio-8088-exec-2] o.a.shiro.mgt.DefaultSecurityManager : Delegate RememberMeManager instance of type [org.apache.shiro.web.mgt.CookieRememberMeManager] threw an exception during onSuccessfulLogin. RememberMe services will not be performed for account [com.sfn.bms.system.model.User@86fc436].
org.apache.shiro.io.SerializationException: Unable to serialize object [com.sfn.bms.system.model.User@86fc436]. In order for the DefaultSerializer to serialize this object, the [org.apache.shiro.subject.SimplePrincipalCollection] class must implement java.io.Serializable.
查找了下原因,原来使用Generator生成的User是没有序列化的
package com.sfn.bms.system.model;
import javax.persistence.*;
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Short id;
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 邮箱
*/
private String email;
/**
* 状态 1-正常,0-禁用,-1-删除
*/
private Boolean status;
/**
* 添加时间
*/
@Column(name = "create_time")
private Integer createTime;
/**
* 上次登陆时间
*/
@Column(name = "last_login_time")
private Integer lastLoginTime;
/**
* 上次登录IP
*/
@Column(name = "last_login_ip")
private String lastLoginIp;
/**
* 登陆次数
*/
@Column(name = "login_count")
private Integer loginCount;
/**
* @return id
*/
public Short getId() {
return id;
}
/**
* @param id
*/
public void setId(Short id) {
this.id = id;
}
/**
* 获取账号
*
* @return account - 账号
*/
public String getAccount() {
return account;
}
/**
* 设置账号
*
* @param account 账号
*/
public void setAccount(String account) {
this.account = account == null ? null : account.trim();
}
/**
* 获取密码
*
* @return password - 密码
*/
public String getPassword() {
return password;
}
/**
* 设置密码
*
* @param password 密码
*/
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
/**
* 获取邮箱
*
* @return email - 邮箱
*/
public String getEmail() {
return email;
}
/**
* 设置邮箱
*
* @param email 邮箱
*/
public void setEmail(String email) {
this.email = email == null ? null : email.trim();
}
/**
* 获取状态 1-正常,0-禁用,-1-删除
*
* @return status - 状态 1-正常,0-禁用,-1-删除
*/
public Boolean getStatus() {
return status;
}
/**
* 设置状态 1-正常,0-禁用,-1-删除
*
* @param status 状态 1-正常,0-禁用,-1-删除
*/
public void setStatus(Boolean status) {
this.status = status;
}
/**
* 获取添加时间
*
* @return create_time - 添加时间
*/
public Integer getCreateTime() {
return createTime;
}
/**
* 设置添加时间
*
* @param createTime 添加时间
*/
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
/**
* 获取上次登陆时间
*
* @return last_login_time - 上次登陆时间
*/
public Integer getLastLoginTime() {
return lastLoginTime;
}
/**
* 设置上次登陆时间
*
* @param lastLoginTime 上次登陆时间
*/
public void setLastLoginTime(Integer lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
/**
* 获取上次登录IP
*
* @return last_login_ip - 上次登录IP
*/
public String getLastLoginIp() {
return lastLoginIp;
}
/**
* 设置上次登录IP
*
* @param lastLoginIp 上次登录IP
*/
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp == null ? null : lastLoginIp.trim();
}
/**
* 获取登陆次数
*
* @return login_count - 登陆次数
*/
public Integer getLoginCount() {
return loginCount;
}
/**
* 设置登陆次数
*
* @param loginCount 登陆次数
*/
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
}
View Code
而这里User需要实现序列化,所以要实现Serializable类
解决方案:
MyBatis Generator提供了SerializablePlugin插件用来在代码生成时实现序列化
使用:在配置文件 mybatis-generator.xml 中 SerializablePlugin 插件,添加
完整的配置
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/bms?serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true" userId="root" password="root">
View Code
重新执行generator,生成User
package com.sfn.bms.system.model;
import java.io.Serializable;
import javax.persistence.*;
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Short id;
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 邮箱
*/
private String email;
/**
* 状态 1-正常,0-禁用,-1-删除
*/
private Boolean status;
/**
* 添加时间
*/
@Column(name = "create_time")
private Integer createTime;
/**
* 上次登陆时间
*/
@Column(name = "last_login_time")
private Integer lastLoginTime;
/**
* 上次登录IP
*/
@Column(name = "last_login_ip")
private String lastLoginIp;
/**
* 登陆次数
*/
@Column(name = "login_count")
private Integer loginCount;
private static final long serialVersionUID = 1L;
/**
* @return id
*/
public Short getId() {
return id;
}
/**
* @param id
*/
public void setId(Short id) {
this.id = id;
}
/**
* 获取账号
*
* @return account - 账号
*/
public String getAccount() {
return account;
}
/**
* 设置账号
*
* @param account 账号
*/
public void setAccount(String account) {
this.account = account == null ? null : account.trim();
}
/**
* 获取密码
*
* @return password - 密码
*/
public String getPassword() {
return password;
}
/**
* 设置密码
*
* @param password 密码
*/
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
/**
* 获取邮箱
*
* @return email - 邮箱
*/
public String getEmail() {
return email;
}
/**
* 设置邮箱
*
* @param email 邮箱
*/
public void setEmail(String email) {
this.email = email == null ? null : email.trim();
}
/**
* 获取状态 1-正常,0-禁用,-1-删除
*
* @return status - 状态 1-正常,0-禁用,-1-删除
*/
public Boolean getStatus() {
return status;
}
/**
* 设置状态 1-正常,0-禁用,-1-删除
*
* @param status 状态 1-正常,0-禁用,-1-删除
*/
public void setStatus(Boolean status) {
this.status = status;
}
/**
* 获取添加时间
*
* @return create_time - 添加时间
*/
public Integer getCreateTime() {
return createTime;
}
/**
* 设置添加时间
*
* @param createTime 添加时间
*/
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
/**
* 获取上次登陆时间
*
* @return last_login_time - 上次登陆时间
*/
public Integer getLastLoginTime() {
return lastLoginTime;
}
/**
* 设置上次登陆时间
*
* @param lastLoginTime 上次登陆时间
*/
public void setLastLoginTime(Integer lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
/**
* 获取上次登录IP
*
* @return last_login_ip - 上次登录IP
*/
public String getLastLoginIp() {
return lastLoginIp;
}
/**
* 设置上次登录IP
*
* @param lastLoginIp 上次登录IP
*/
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp == null ? null : lastLoginIp.trim();
}
/**
* 获取登陆次数
*
* @return login_count - 登陆次数
*/
public Integer getLoginCount() {
return loginCount;
}
/**
* 设置登陆次数
*
* @param loginCount 登陆次数
*/
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
}
View Code
前后生成User的区别:
1.实现了Serializable接口
2.增加了private static final long serialVersionUID = 1L;
问题解决
精彩文章
发表评论