Spring 和 Tuckey URLRewriter *** 异常

Posted

技术标签:

【中文标题】Spring 和 Tuckey URLRewriter *** 异常【英文标题】:Spring and Tuckey URLRewriter *** Exception 【发布时间】:2015-06-25 18:15:30 【问题描述】:

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

我正在尝试将 tukey url 重写器与我的 spring 应用程序一起使用,以便更好地支持 angularjs html5mode。

如果请求uri不是/api或/socket,我想要将任何请求转发到/。如果请求是 /api 或 /socket 我希望他们通过 spring 和 dispather servlet 并应用 spring web security。

这是我的 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);



重写器正在被选中,因为我可以转到 localhost:8080/rewrite-status 并且我的配置在那里,并且页面说它应该做我想做的事情。

我的 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 中某处的一些递归。如果我删除 tukey 一切正常 线程“http-bio-8080-exec-1”中的异常 java.lang.***Error 在 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)

【问题讨论】:

【参考方案1】:

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

希望有帮助

【讨论】:

以上是关于Spring 和 Tuckey URLRewriter *** 异常的主要内容,如果未能解决你的问题,请参考以下文章

使用urlrewritefilter发现部分请求url报404

为啥 Tuckey UrlRewrite Filter 在规则匹配后不调用chain.doFilter?

Tuckey 过滤器 - https 重定向

Spring URL重写

如何从 URL、Spring Boot 和 AngularJs 应用程序中删除 #?

Wildfly及UrlRewrite