shiro登录之后返回之前的页面(空指针异常问题解决)

前言

在日常项目开发过程中,登录注册功能是比较常见的。公司项目使用shiro作为安全框架,我们一般在使用shiro登录之后,会跳转到默认的首页。上面这种登录方式是用户直接访问登录,但是在实际应用中我们经常会留出一些页面给游客查看,当然这些页面中的一些详细信息就需要注册或者登录之后才能查看了,如果该用户没有登录,我们应该给他拦截住,让他去登录。那么一个用户在应用的一个页面想查看该页面的详细信息,点击之后需要,该用户登录了,结果直接返回到应用的首页。用户刚才想要查看的页面都没了。用户如果想要查看刚才自己浏览的页面还得自己慢慢点击过去,这样的用户体验显然不是很好。那么有没有什么办法能让被拦截的用户登录之后直接跳转到刚才用户请求的页面呢?

基于shiro的功能实现

对于上面的功能实现,其实shiro已经帮我们考虑到了,我们不需要自己来实现了。之前想过用拦截器来拦截请求,然后获取请求的请求信息,然后存到session中去,在用户登录之后再从session中取出来,然后重定向过去,其实shiro的实现原理大致也是这样。我们可以看看shiro的源码,在shiro中如果我们的请求没有经过验证,shiro会调用saveRequest方法来将之前的请求存到session中,具体源码如下
这里写图片描述
然后我们再登录之后,就可以从session中来进去获取就行了,这个获取方法shiro也已经帮我们写好了,具体源码如下
这里写图片描述
我们在登录方法中添加这几行代码就可以实现上面的功能了

SavedRequest savedRequest=WebUtils.getSavedRequest(request);
if(null!=savedRequest){
    System.out.println("注意登录之前的路径是"+savedRequest.getRequestUrl());
    return "redirect:" + savedRequest.getRequestUrl().substring(8);
}

所以说shiro还是很实用的

获取到的savedRequest为空

按照上面的思路,本以为功能应该实现了,但是在登录之后却莫名其妙的报了个空指针异常。原来是上面获取的savedRequest是null,那是怎么回事呢?难道shiro没有将登录之前的请求存储到session之中,后来仔细看了一下我们项目中在用shiro登录的时候,为了防止会话劫持,在登录的方法里面是手动把session注销了,然后又重新生成了session,所以在后生成的session中是没有保存之前的请求数据的,所以就报空指针异常了。所以把下面的会话注销注释掉就行了

Subject sb = SecurityUtils.getSubject();
Session se = sb.getSession();
UsernamePasswordToken token=new UsernamePasswordToken(username, password);
sb.login(token);
/*se.stop();
sb.login(token);*/
se=sb.getSession(true);

还有一点需要注意shiro不会把所有请求的信息都存放在session之中,只有那些没有经过验证的请求,所以这些请求,我们不能在shiro的过滤链中把他过滤掉。

总结

上面只是对于shiro使用的小总结,上面的功能其实spring security安全框架中也有类似功能,我们需要根据自己项目中实际使用情况来进行灵活运用!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值