1. 问题提出的根源:
处理404 notfound错误。
原因分析
shiro的DefaultWebSessionManager把session自己管理起来了,不放到web容器里,那么当发生404时,web容器在处理过程里发现容器里没有session,那么就会建立一个新的sessionid,然后把sessionid绑定到请求上。于是shiro框架就认为是一个新的session来了,但是没有登录,所以自动跳转到login页面。
成功的方案
不用web容器的error-page处理。在spring mvc里配置一个能匹配所有请求的处理器,但是要保证这个默认的处理器排在url映射匹配排序的最后。
在spring-mvc.xml里添加如下的bean
<bean id="defaultController" class="com.ikang.base.web.DefaultController" />
<bean id="defaultUrlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="2147483647" /><!-- 此处的order很重要,要低于 mvc:resources的默认值214 7483646-->
<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注解方式的话,就不能保证顺序排在匹配映射顺序的最后了。