问题说明:
[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
其中:flag为原有页面中登陆错误信息标志位
参考文献:[url]http://www.360doc.com/content/14/0730/14/11298474_398125873.shtml#[/url]
[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]