服務器:Tomcat的7
春:第4版
Spring Security的版本3.25
Tuckey:4.0.3
春Tuckey URLRewriter的StackOverflow異常
我想使用tuckey URL重寫,在我的Spring應用程序爲了更好地支持angularjs html5mode。
我想將任何請求轉發到/如果request-uri不是/ api或/ socket。如果請求是/ api或/ socket,我希望他們通過spring和dispather servlet並應用spring web安全。
這裏是我webintializer類: 公共類ApplicationInitializer實現WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(PersistenceConfig.class, WebSecurityConfig.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
webContext.register(ApplicationConfig.class);
AnnotationConfigWebApplicationContext socketContext = new AnnotationConfigWebApplicationContext();
webContext.register(WebSocketConfig.class);
ServletRegistration.Dynamic restApi = servletContext.addServlet("rest-api", new DispatcherServlet(webContext));
restApi.setLoadOnStartup(1);
restApi.addMapping("/api");
ServletRegistration.Dynamic webSocket = servletContext.addServlet("web-socket", new DispatcherServlet(socketContext));
webSocket.setLoadOnStartup(1);
webSocket.addMapping("/socket");
Dynamic springSecurityFilter = servletContext.addFilter(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME, DelegatingFilterProxy.class);
springSecurityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/api/*");
springSecurityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/socket/*");
UrlRewriteFilter urlRewriteFilter = new UrlRewriteFilter();
Map<String, String> urlRewriteFilterParams = new HashMap<String, String>();
urlRewriteFilterParams.put("confReloadCheckInterval", "0");
urlRewriteFilterParams.put("confPath", "/WEB-INF/classes/urlrewrite.xml");
urlRewriteFilterParams.put("statusEnabled", "true");
urlRewriteFilterParams.put("logLevel", "DEBUG");
urlRewriteFilterParams.put("statusEnabledOnHosts", "localhost");
Dynamic tuckeyRewriteFilter = servletContext.addFilter("UrlRewriteFilter", urlRewriteFilter);
tuckeyRewriteFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD), false, "/*");
tuckeyRewriteFilter.setInitParameters(urlRewriteFilterParams);
}
}
的重寫是越來越拾起,因爲我可以到本地主機:8080 /重寫狀態和我的配置是存在的頁面說它應該做我想做的事情。
我Tuckey UrlRewrite.XML文件如下:
<!DOCTYPE urlrewrite
PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite default-match-type="wildcard">
<rule>
<condition type="request-uri" operator="notequal">/api/**</condition>
<condition type="request-uri" operator="notequal">/socket/**</condition>
<from>/**</from>
<to type="forward">/$1</to>
</rule>
</urlrewrite>
我得到的錯誤如下。這似乎是某種內在某種地方的遞歸性。如果我刪除了tuckey,一切正常 線程「http-bio-8080-exec-1」中的異常java.lang.StackOverflowError at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) at org .apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) at org.apache.catalina.core.ApplicationHttpRequest.setAttribute (ApplicationHttpRequest.java:281) 在org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)