调试shiro 处理登陆后页面跳转问题时,页面总是无法跳转到之前访问的页面去,查看配置,没有问题。
经查看 登陆前已经保存了请求,但是登陆后获取却为空,经查看登陆前后的sessionid 不一致。
shiro 配置如下:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="frontsystemAuthorizingRealm" />
<property name="cacheManager" ref="shiroCacheManager" />
</bean>
每次请求sessionid应该一致,但是却发现每次访问sessionid都不一样,一个浏览器一个窗口的情况
最后发现,原来代码中多做了用户退出操作。
虽然删了多余的用户退出,还是无法记录之前访问的页面,最后发现以下shiro 源码:
public static SavedRequest getAndClearSavedRequest(ServletRequest request) {SavedRequest savedRequest = getSavedRequest(request);
if (savedRequest != null) {
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
session.removeAttribute(SAVED_REQUEST_KEY);
}
return savedRequest;
该方法在一次请求中不能重复调用。
另外:使用org.apache.shiro.web.session.mgt.DefaultWebSessionManager
却出现sessionid 不存在异常
经查看是 freemarker 访问标签时调用的session 不存在导致,初步解释,freemarker 和DefaultWebSessionManager 存在兼容性问题