. 一般做法:
在web.xml里配置error-page.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/404.jsp</location>
</error-page>
项目当中使用shiro安全框架,配置了非ServletContainer的session管理器。
如果自定义了sessionManager,即session不由web容器来管理,而是我们自己处理,比如讲session放到couchbase上面或者其他分布式缓存上面,
此时,如果想同时使用< error-page>来处理404错误,就会造成session的重新建立,表现为已登录用户,访问一个不存在的url,得到一个返回404页面,然后再访问正确的url地址又需要重新登录。
之所以这样是因为:
shiro的DefaultWebSessionManager把session自己管理起来了,不放到web容器里,那么当发生404时,web容器在处理过程里发现容器里没有session,那么就会建立一个新的sessionid,然后把sessionid绑定到请求上。于是shiro框架就认为是一个新的session来了,但是没有登录,所以自动跳转到login页面。
解决办法
shiroFilter拦截器下加入下面代码
完整配置
一定要加这几行
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>