1. 一般我们会在web.xml配置统一错误页面:
<error-page> <error-code>404</error-code> <location>/web-inf/views/error/404.jsp</location> </error-page> |
2. 场景:
1、首先登录成功后访问正常页面没有问题的;
2、接着访问一个不存在的页面,即跳到相应的404页面,假设我的页面是jsp的;
3、再刷新一下就会又跳到登录页面。
3.分析
shiro的defaultwebsessionmanager把 session 自己管理起来了,不放到 web 容器里,那么当发生 404 时, web 容器在处理过程里发现容器里没有 session ,那么就会建立一个新的 sessionid ,然后把 sessionid 绑定到请求上。于是 shiro 框架就认为是一个新的 session 来了,但是没有登录,所以自动跳转到 login 页面。
4.解决办法
<!-- 处理shiro 404 session丢失的问题 -->
<bean id="defaultController" class="com.ishopping.manage.controller.DefaultController" />
<bean id="defaulturlmapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="2147483647" /><!-- 此处的order很重要,要低于 mvc:resources的默认值2147483646-->
<property name="mappings">
<props>
<prop key="/*/**">defaultController</prop>
</props>
</property>
</bean>
public class DefaultController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
return new ModelAndView("error/404");
}
}
注意:此controller一定不要用annotation方式,必须如上实现controller接口。因为如果用@controller/@requestmapping注解方式的话,就不能保证顺序排在匹配映射顺序的最后了
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%92%E8%A1%8C/2976.shtml