org.apache.shiro.session.UnknownSessionException

本文分析了一种因数字用户名注册而导致的登录异常问题,详细解释了异常产生的原因,并提出了具体的解决方案,包括调整会话超时时间和改进账户信息查询接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题说明:
[list]
[*]背景:系统登录,原允许用户名、手机号码、邮箱三者之一加密码进行登录,故在注册时严格限制注册用户名不能以数字开头,避免用户名与手机号码区分不开,即造成从数据库读取数据时出错的问题
[*]问题:刚刚接手,不了解之前的业务逻辑以及注册限制,且现在取消了手机号码以及邮箱登陆,导致用一串数字注册用户名时没有进行限制,注册成功了,但登录时报错
[/list]

[img]http://dl2.iteye.com/upload/attachment/0109/8055/2d0105b6-1903-3a16-8930-3dcca996f70f.jpg[/img]

原因:
[list]
[*]用户名为一串数字,调用底层接口根据用户查询相应用户信息时误将其作为手机号码进行查询,结果为空,抛出异常
[*]根据新的业务逻辑,此处不仅仅是登陆逻辑,而要判断账号所关联的商户的审核状态,故若用户登录后,依然要判断其审核状态,若不符合登陆要求,强制其推出登录
[/list]

处理过程:
1.session过期时间太短,导致session过期找不到session报错,

这里org.apache.shiro.web.session.mgt.DefaultWebSessionManager设置session时间
globalSessionTimeout时间太短 这个单位是毫秒,建议设置长点时间

2.时间修改长后,还是报错,但是可以执行  SecurityUtils.getSubject().logout();程序执行到return "index";报错

logout可以安全正确退出,session也可以删除,授权信息,认证信息也会被清除(debug进去可以看到的)

但是如果直接return就会报错

3.DEBUG方式

org.apache.shiro.session.UnknownSessionException: There is no session with id
debug进去发现,直接return程序还是会查找你刚才logout的sessionId,因为logout了,当然是找不到session了,理所当然报错

解决方法:

1.修改查询账户信息接口

兼容用户名为数字时的情况

注:公共调用接口,不可改动太大,尽量兼容,避免其他调用接口的位置报错

2.解决报错问题

将原有跳转页面处理改为跳转redirect


@Result(name = ERROR, params = {"flag", "${flag}"}, type = ResultTypeConstants.REDIRECT, location = "/loginpage.do")


其中:flag为原有页面中登陆错误信息标志位

参考文献:[url]http://www.360doc.com/content/14/0730/14/11298474_398125873.shtml#[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值