.?一般做法:
在web.xml里配置error-page.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/404.jsp</location>
</error-page>
項目當(dāng)中使用shiro安全框架,配置了非ServletContainer的session管理器。
如果自定義了sessionManager,即session不由web容器來管理,而是我們自己處理,比如講session放到couchbase上面或者其他分布式緩存上面,

此時,如果想同時使用< error-page>來處理404錯誤,就會造成session的重新建立,表現(xiàn)為已登錄用戶,訪問一個不存在的url,得到一個返回404頁面,然后再訪問正確的url地址又需要重新登錄。
之所以這樣是因為:
shiro的DefaultWebSessionManager把session自己管理起來了,不放到web容器里,那么當(dāng)發(fā)生404時,web容器在處理過程里發(fā)現(xiàn)容器里沒有session,那么就會建立一個新的sessionid,然后把sessionid綁定到請求上。于是shiro框架就認(rèn)為是一個新的session來了,但是沒有登錄,所以自動跳轉(zhuǎn)到login頁面。
解決辦法
shiroFilter攔截器下加入下面代碼

完整配置

一定要加這幾行
<dispatcher>REQUEST</dispatcher>
? ? ? ? <dispatcher>FORWARD</dispatcher>
? ? ? ? <dispatcher>INCLUDE</dispatcher>
? ? ? ? <dispatcher>ERROR</dispatcher>