shiro登陆后没有返回设置的successUrl?

  第一次学习shiro的时候,并没有发现很大的问题。但后来在做项目的时候,特别是当访问的url是iframe的页面的时候,session又过期了,跳转到登陆页,完成登陆操作后,返回了只有iframe的页面,相当不好看。虽然在shiro里设置了successUrl,但是没有起作用。

  不明真相的我,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);
}

  源码是我们最好的老师,如果网上找不到答案,可以尝试一下读源代码,这样可以对框架有一个更好的了解,准确运用框架有更好的帮助。

原文地址:https://www.cnblogs.com/ginponson/p/5205962.html