在实现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;

问题解决

 

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。