1

сервер: Tomcat 7
Spring: Version 4 версии
Spring Security 3,25
Таки: 4.0.3
Spring и Таки URLRewriter StackOverflow Exception

Я пытаюсь использовать Таки URL-адрес Rewriter с моим яровым применением в чтобы лучше поддерживать angularjs html5mode.

Я хотел бы перенаправить любой запрос в/если запрос-uri не является/api или/socket. Если запрос есть/api или/socket, я бы хотел, чтобы они проходили через весну и сервлет dispather и применяли весеннюю паутину.

Вот мой 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); 

} 
} 

ReWriter становится взял, потому что я могу пойти на локальный хост: 8080/перепишет-статус и мой конфиг есть и страница говорит, что он должен делать то, что я хочу, чтобы он делал.

Мой Таки 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. Если я удаляю 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)

ответ

2

DispatcherType.FORWARD в определении фильтра вызывает правило, чтобы быть реплицируется к себе. При использовании фильтра перезаписи URL-адресов вы хотите отобразить его только на REQUEST.

Надеюсь, что поможет