Angularjs Spring和Tuckey URLRewriter堆栈溢出异常

Angularjs Spring和Tuckey URLRewriter堆栈溢出异常,angularjs,spring,servlet-filters,servlet-3.0,tuckey-urlrewrite-filter,Angularjs,Spring,Servlet Filters,Servlet 3.0,Tuckey Urlrewrite Filter,服务器:Tomcat 7 春季:第4版 Spring Security 3.25版 塔基:4.0.3 为了更好地支持angularjs HTML5模式,我尝试在spring应用程序中使用tuckey url重写器 如果请求uri不是/api或/socket,我希望将任何请求转发给/如果请求uri不是/api或/socket。如果请求是/api或/socket,我希望它们通过spring和dispatherservlet,并应用springweb安全性 这是我的WebInitializer类: 公

服务器:Tomcat 7
春季:第4版
Spring Security 3.25版
塔基:4.0.3

为了更好地支持angularjs HTML5模式,我尝试在spring应用程序中使用tuckey url重写器

如果请求uri不是/api或/socket,我希望将任何请求转发给/如果请求uri不是/api或/socket。如果请求是/api或/socket,我希望它们通过spring和dispatherservlet,并应用springweb安全性

这是我的WebInitializer类: 公共类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);

}
}
@覆盖
启动时公共void(ServletContext ServletContext)引发ServletException{
AnnotationConfigWebApplicationContext rootContext=新的AnnotationConfigWebApplicationContext();
register(PersistenceConfig.class、WebSecurityConfig.class);
addListener(新的ContextLoaderListener(rootContext));
AnnotationConfigWebApplicationContext webContext=新的AnnotationConfigWebApplicationContext();
webContext.register(ApplicationConfig.class);
AnnotationConfigWebApplicationContext socketContext=新的AnnotationConfigWebApplicationContext();
register(WebSocketConfig.class);
ServletRegistration.Dynamic restApi=servletContext.addServlet(“restApi”,新DispatcherServlet(webContext));
restApi.setLoadOnStartup(1);
restApi.addMapping(“/api”);
ServletRegistration.DynamicWebSocket=servletContext.addServlet(“web套接字”,新DispatcherServlet(socketContext));
webSocket.setLoadOnStartup(1);
addMapping(“/socket”);
Dynamic springSecurityFilter=servletContext.addFilter(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME,DelegatingFilterProxy.class);
springSecurityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class),false,“/api/*”;
addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class),false,“/socket/*”;
UrlRewriteFilter UrlRewriteFilter=新的UrlRewriteFilter();
Map urlRewriteFilterParams=新HashMap();
urlRewriteFilterParams.put(“confReloadCheckInterval”,“0”);
urlRewriteFilterParams.put(“confPath”,“/WEB-INF/classes/urlrewrite.xml”);
urlRewriteFilterParams.put(“statusEnabled”、“true”);
urlRewriteFilterParams.put(“日志级别”、“调试”);
urlRewriteFilterParams.put(“statusEnabledOnHosts”、“localhost”);
动态TuckerReWriteFilter=servletContext.addFilter(“UrlRewriteFilter”,UrlRewriteFilter);
TuckerReWriteFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD),false,“/*”;
TuckerRewriteFilter.setInitParameters(URLRewiteFilterParams);
}
}
重写器被选中是因为我可以转到localhost:8080/rewrite状态,我的配置在那里,页面上说它应该做我希望它做的事情

我的Tuckey UrlRewrite.XML文件如下:


/原料药/**
/插座/**
/**
/$1
我得到的错误如下。这似乎是塔奇内部的某种递归性。如果我去掉塔奇,一切正常 线程“http-bio-8080-exec-1”java.lang.StackOverflowerr中出现异常 位于org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) 位于org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) 位于org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281) 位于org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
在org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)

上,过滤器定义中的
DispatcherType.FORWARD
导致规则递归应用于自身。使用URL重写筛选器时,您只希望将其映射到
请求

希望有帮助

  <!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>