Java Web 排错日记
今天遇到一个问题如下,看起来像是过滤器的问题:
javax.servlet.ServletException: Filtered request failed.
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:384)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:223)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:107)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:75)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:934)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:90)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:494)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:632)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1592)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1550)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException
at org.apache.catalina.webresources.AbstractResourceSet.checkPath(AbstractResourceSet.java:39)
at org.apache.catalina.webresources.DirResourceSet.getResource(DirResourceSet.java:91)
at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:176)
at org.apache.catalina.webresources.CachedResource.validate(CachedResource.java:62)
at org.apache.catalina.webresources.Cache.getResource(Cache.java:78)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:163)
at org.apache.catalina.core.StandardContext.getRealPath(StandardContext.java:4528)
at org.apache.catalina.core.ApplicationContext.getRealPath(ApplicationContext.java:398)
at org.apache.catalina.core.ApplicationContextFacade.getRealPath(ApplicationContextFacade.java:335)
at com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper.getNamedDecorator(FileDecoratorMapper.java:48)
at com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper.getNamedDecorator(AbstractDecoratorMapper.java:50)
at com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper.getNamedDecorator(AbstractDecoratorMapper.java:50)
at com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper.getNamedDecorator(AbstractDecoratorMapper.java:50)
at com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper.getByProperty(PageDecoratorMapper.java:70)
at com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper.getDecorator(PageDecoratorMapper.java:62)
at com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper.getDecorator(AbstractDecoratorMapper.java:45)
at com.opensymphony.module.sitemesh.mapper.InlineDecoratorMapper.getDecorator(InlineDecoratorMapper.java:41)
at com.opensymphony.sitemesh.compatability.DecoratorMapper2DecoratorSelector.selectDecorator(DecoratorMapper2DecoratorSelector.java:30)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:83)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
... 29 more
像这种过滤器抛出的异常,一般是被包装过的,丢失了一部分信息,通过二分法注释 web.xml
中的过滤器,就可以确定出错的过滤器。
另一个思路其实是看 Cased by
后面的第一个调用 org.apache.catalina.webresources.AbstractResourceSet.checkPath
,就可以知道是 tomcat
读取项目资源路径的问题,而不是过滤器的问题,通过修改 tomcat
设置或者更换 tomcat
应该就能解决。
Webresources class AbstractResourceSet throws exception upon callong ServletContext.getRealPath(“”)
Tomcat 8, unlike Tomcat 7.0.42, throws IllegalArgumentException upon calling ServletContext.getRealPath(“”). It seems that TC8 expects that argument provided to getRealPath is non-empty string.
I believe that ServletContext.getRealPath should allow empty string as argument.