shiro登陆后没有返回设置的successUrl?
2016-02-23 19:57
471 查看
第一次学习shiro的时候,并没有发现很大的问题。但后来在做项目的时候,特别是当访问的url是iframe的页面的时候,session又过期了,跳转到登陆页,完成登陆操作后,返回了只有iframe的页面,相当不好看。虽然在shiro里设置了successUrl,但是没有起作用。
不明真相的我,debug后跟进去观察后发现FormAuthenticationFilter成功登陆后,会调用它的onLoginSuccess方法,最后会调用下面这个实际执行的方法。
我们来窥一下这个方法实际做了什么。
可以看出如果由之前的页面跳转到登陆页的话,savedRequest保存了原来的地址,这个地址会取代我们设置的successUrl;只有当savedRequest为null的时候,successUrl才会是我们设置的地址。
好了,那我们要怎么做避免它返回页面,只返回到我们指定的页面呢?如果要我选的话,我会选择继承FormAuthenticationFilter并重写父类的方法AuthenticationFilter的issueSuccessRedirect方法,最后差不多就是
源码是我们最好的老师,如果网上找不到答案,可以尝试一下读源代码,这样可以对框架有一个更好的了解,准确运用框架有更好的帮助。
不明真相的我,debug后跟进去观察后发现FormAuthenticationFilter成功登陆后,会调用它的onLoginSuccess方法,最后会调用下面这个实际执行的方法。
WebUtils.redirectToSavedRequest(request, response, getSuccessUrl());
我们来窥一下这个方法实际做了什么。
public static void redirectToSavedRequest(ServletRequest request, ServletResponse response, String fallbackUrl)throws IOException { String successUrl = null; boolean contextRelative = true; SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request); if (savedRequest != null && savedRequest.getMethod().equalsIgnoreCase(AccessControlFilter.GET_METHOD)){ successUrl = savedRequest.getRequestUrl(); contextRelative = false; } if (successUrl == null) { successUrl = fallbackUrl; } if (successUrl == null) { throw new IllegalStateException("....."); } WebUtils.issueRedirect(request, response, successUrl, null, contextRelative); }
可以看出如果由之前的页面跳转到登陆页的话,savedRequest保存了原来的地址,这个地址会取代我们设置的successUrl;只有当savedRequest为null的时候,successUrl才会是我们设置的地址。
好了,那我们要怎么做避免它返回页面,只返回到我们指定的页面呢?如果要我选的话,我会选择继承FormAuthenticationFilter并重写父类的方法AuthenticationFilter的issueSuccessRedirect方法,最后差不多就是
@override protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception { WebUtils.issueRedirect(request, response, successUrl, null, true); }
源码是我们最好的老师,如果网上找不到答案,可以尝试一下读源代码,这样可以对框架有一个更好的了解,准确运用框架有更好的帮助。
相关文章推荐
- Hardware Acceleration
- Java基础语法
- not in null
- Intent简介
- iOS 开发 -- Swift 语法篇 (三) 控制流
- 【POJ 2104】 K-th Number 主席树模板题
- JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度
- python正则表达式练习篇
- 手动更新Wamp中php版本的方法
- linux系统中删除eth*.bak或者多余的网卡
- Linux文件属性
- HDU1095 A+B for Input-Output Practice (VII)(入门水题,C,Java两个版本)
- 机房重构所遇问题及解决办法集锦(一)
- 正则表达式语法大全
- 条件语句
- const,typedef与define
- android shape绘制组件边框
- 程序员如何留住健康?
- oracle执行update语句卡住不动
- java接口编程题