1. 問題提出的根源:java
處理404 notfound錯誤。web
緣由分析spring
shiro的DefaultWebSessionManager把session本身管理起來了,不放到web容器裏,那麼當發生404時,web容器在處理過程裏發現容器裏沒有session,那麼就會創建一個新的sessionid,而後把sessionid綁定到請求上。因而shiro框架就認爲是一個新的session來了,可是沒有登陸,因此自動跳轉到login頁面。spring-mvc
成功的方案session
不用web容器的error-page處理。在spring mvc裏配置一個能匹配全部請求的處理器,可是要保證這個默認的處理器排在url映射匹配排序的最後。mvc
在spring-mvc.xml裏添加以下的beanapp
<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註解方式的話,就不能保證順序排在匹配映射順序的最後了。框架