在视频教程中讲请求认证成功后跳转页面的问题是一笔带过的,但是我觉得有必要单独写一篇对应的文章进行叙述。
我用了SSH来整合Shiro,在开发后验证的过程中,每次登陆后Shiro都会跳转到一个不知名js中,但是重点是我上一次访问的地址是:
http://localhost:8080/shiro_05/user/login.action
认证之后应该跳转到上一个请求的地址,但是Shiro却跳转到了:
http://localhost:8080/shiro_05/user/js/eqmt.js
本应该跳转到上一次访问的页面的,但是却跳转到这个js文件的请求路径中,而且这个路径还是奇奇怪怪的。
我猜这个问题应该困扰了不少人,即使js、css等文件夹配置了匿名访问等,还是出现这个问题:【认证后地址乱跳,不是上一个你所请求进来时候所在的地址】。甚至有人放弃了Shiro自带的“跳转到上一个请求路径”这个功能。应该也有很多人解决了这个问题,在这里,我就简单说一下吧。
经过检查后终于发现问题所在:在页面中存在另一个非绝对路径的请求地址!
此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51132560
更多有关老猫的文章:http://blog.csdn.net/nthack5730
首先说一下在Shiro中配置默认认证成功后跳转的地址或者请求:
在shiroFilter的Bean配置中
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
....
</bean>
添加一下参数:
<property name="successUrl" value="/user/list.action" />
就可以使每次在认证成功后自动转发到value里面的地址(我这里用的是/user/list.action,也就是去请求这个地址)
当不配置这个参数的时候,Shiro会自动请求上一次你访问的地址。假设,你访问地址:http://localhost:8080/shiro_01/user/
现在假设这个地址是需要认证通过才能访问的,也就是在过滤链中配置为/user/** = authc
那么就会进入认证页面,而上面的地址就会被保存至Shiro中,当认证通过后,会自动请求浏览器访问刚刚保存的地址。
http://localhost:8080/shiro_01/user/
但是当页面文件加载不正确,在认证完成后就会访问地址:
http://localhost:8080/shiro_01/user/***.***
我的修改前的页面在认证后浏览器会去访问下面这个地址:
http://localhost:8080/shiro_01/user/js/eqmt.js
此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51132560
更多有关老猫的文章:http://blog.csdn.net/nthack5730
为什么会出现这个问题呢,原因就在于登陆页面中或许有部分的第三方加载的样式、js等文件没有被正确录入。什么是不正确录入,只要是请求本地服务器,或者请求为:http://localhost:8080/shiro_01/*******.***
这种形式的,也就是在认证前和你上一个访问的页面之间再访问本服务器被shiro拦截的任意地址。就会被Shiro自动保存至上一个请求地址的这个变量中,当你认证完成后会Shiro就会要求你的浏览器自动跳转到这个地址。
【注:CDN挂载加载的不算,因为不是请求本服务器。】
下面给出我的页面代码,里面的请求【自带js】这部分就是为http请求的而不是绝对路径加载进来的:
<!-- 公共样式文件引入 -->
<jsp:include page="Template/css.jsp"></jsp:include>
<!-- 自带js -->
<script src="js/eqmt.js"></script>
<!-- 自建样式表 -->
<link href="${pageContext.request.contextPath}/css/eqmt.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/css/login.css" rel="stylesheet" type="text/css">
除了:<script src="js/eqmt.js"></script>
这个加载通过绝对路径加载不成功,然后浏览器自动访问了相对地址,即浏览器用http的形式访问,Shiro记录这个eqmt.js文件的访问地址(还是错误的地址)其他的都是内部绝对路径访问的。【我在过滤链里面配置了对应绝对路径的文件的匿名访问】
只要将错误加载的代码改正或删除或者将文件挂载到cdn访问,问题就可以解决了:
<script src="${pageContext.request.contextPath}/js/eqmt.js"></script>
PS:里面的:${pageContext.request.contextPath}是我的项目地址。JSP有这个蛋疼的问题,相信很多人都知道。
【上面的总结是我个人感受写的,可能具体的学名和形容词在形容的过程中用得不恰当,望大家发现后指出并帮忙纠正,感激不尽!】
此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51132560
更多有关老猫的文章:http://blog.csdn.net/nthack5730