首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring和Tuckey URLRewriter StackOverflow异常

Spring和Tuckey URLRewriter StackOverflow异常
EN

Stack Overflow用户
提问于 2015-04-18 22:59:00
回答 1查看 953关注 0票数 1

服务器: Tomcat 7

Spring:第4版

Spring安全版本3.25

图基: 4.0.3

我试图在我的spring应用程序中使用tuckey url重写器,以便更好地支持angularjs html5mode。

我想要的是将任何请求转发到/如果请求-uri不是/api或/socket。如果请求是/api或/socket,我希望它们能够通过spring和dispather,并应用spring安全。

下面是我的webintializer类:公共类ApplicationInitializer实现WebApplicationInitializer {

代码语言:javascript
复制
@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);

}
}

因为我可以进入localhost:8080/重写状态,并且我的配置在那里,页面说它应该做我想做的事情,所以重写器被选中了。

我的Tuckey UrlRewrite.XML文件如下:

代码语言:javascript
复制
  <!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,那么在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) at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)线程"http-bio-8080-exec-1“线程中的所有操作都是很好的异常。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 18:51:13

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

希望这有帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29723867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档