Copyright © 1999-2020, CSDNNET, All Rights Reserved

 登录
shiro登录之后返回之前的页面(空指针异常问题解决)
前言
在日常项目开发过程中,登录注册功能是比较常见的。公司项目使用shiro作为安全框架,我们一般在使用shiro登录之后,会跳转到默认的首页。上面这种登录方式是用户直接访问登录,但是在实际应用中我们经常会留出一些页面给游客查看,当然这些页面中的一些详细信息就需要注册或者登录之后才能查看了,如果该用户没有登录,我们应该给他拦截住,让他去登录。那么一个用户在应用的一个页面想查看该页面的详细信息,点击之后需要,该用户登录了,结果直接返回到应用的首页。用户刚才想要查看的页面都没了。用户如果想要查看刚才自己浏览的页面还得自己慢慢点击过去,这样的用户体验显然不是很好。那么有没有什么办法能让被拦截的用户登录之后直接跳转到刚才用户请求的页面呢?
基于shiro的功能实现
对于上面的功能实现,其实shiro已经帮我们考虑到了,我们不需要自己来实现了。之前想过用拦截器来拦截请求,然后获取请求的请求信息,然后存到session中去,在用户登录之后再从session中取出来,然后重定向过去,其实shiro的实现原理大致也是这样。我们可以看看shiro的源码,在shiro中如果我们的请求没有经过验证,shiro会调用saveRequest方法来将之前的请求存到session中,具体源码如下

然后我们再登录之后,就可以从session中来进去获取就行了,这个获取方法shiro也已经帮我们写好了,具体源码如下

我们在登录方法中添加这几行代码就可以实现上面的功能了
SavedRequest savedRequest=WebUtilsgetSavedRequest(request);
if(null!=savedRequest){
Systemoutprintln("注意登录之前的路径是"+savedRequestgetRequestUrl());
return "redirect:" + savedRequestgetRequestUrl()substring(8);
}
所以说shiro还是很实用的
获取到的savedRequest为空
按照上面的思路,本以为功能应该实现了,但是在登录之后却莫名其妙的报了个空指针异常。原来是上面获取的savedRequest是null,那是怎么回事呢难道shiro没有将登录之前的请求存储到session之中,后来仔细看了一下我们项目中在用shiro登录的时候,为了防止会话劫持,在登录的方法里面是手动把session注销了,然后又重新生成了session,所以在后生成的session中是没有保存之前的请求数据的,所以就报空指针异常了。所以把下面的会话注销注释掉就行了
Subject sb = SecurityUtilsgetSubject();
Session se = sbgetSession();
UsernamePasswordToken token=new UsernamePasswordToken(username, password);
sblogin(token);
/sestop();
sblogin(token);/
se=sbgetSession(true);
还有一点需要注意shiro不会把所有请求的信息都存放在session之中,只有那些没有经过验证的请求,所以这些请求,我们不能在shiro的过滤链中把他过滤掉。
总结
上面只是对于shiro使用的小总结,上面的功能其实spring security安全框架中也有类似功能,我们需要根据自己项目中实际使用情况来进行灵活运用!
您好,很高兴为您解答:
1、力推 Filter 过滤器,
2、后台判断根据权限跳转页面
登陆成功后获取 Subject 对象
然后通过 Subject 对象来判断当前用户的角色/权限,之后执行不同的跳转(直接在LoginAction中做)
以上就是关于小米手机获取手机信息返回空消息全部的内容,包括:小米手机获取手机信息返回空消息、如何使用Shiro实现不同用户登录成功后跳转到不同主页、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)