3

Я изучаю, как выполнять перезаписи URL-адресов на Tomcat 8 и продолжать работать в тех же двух предложениях.Tuckey URL Rewrite Filter Конфигурация Java-класса

1) Использовать Tuckey URLRewriteFilter. 2) Запустите Apache поверх Tomcat, чтобы использовать mod_rewrite.

В отношении первого, у URLRewriteFilter отсутствует документация о том, как настроить в формате Java, а не в формате XML. Мое приложение Spring MVC не использует файл web.xml - вся конфигурация выполняется через классы Java - и поэтому я не могу настроить XML.

Есть ли способ настроить таким образом или есть хорошие альтернативы, кроме попытки запустить Apache поверх Tomcat?

Например, есть способ для достижения этой цели в Java, в отличие от XML:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

Это мой WebApplicationInitializer класс:

public class Initializer implements WebApplicationInitializer { 

@Override 
public void onStartup(ServletContext container) { 
    // Create the 'root' Spring application context 
    AnnotationConfigWebApplicationContext rootContext = 
    new AnnotationConfigWebApplicationContext(); 
    rootContext.register(RootConfig.class); 

    // Manage the lifecycle of the root application context 
    container.addListener(new ContextLoaderListener(rootContext)); 

    // Create the dispatcher servlet's Spring application context 
    AnnotationConfigWebApplicationContext dispatcherContext = 
    new AnnotationConfigWebApplicationContext(); 
    dispatcherContext.register(WebAppConfig.class); 

    // Register and map the dispatcher servlet 
    ServletRegistration.Dynamic dispatcher = 
    container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
    dispatcher.setLoadOnStartup(1); 
    dispatcher.addMapping("/*"); 
    dispatcher.addMapping("*.html"); 
} 

} 

Мой RootConfig

@Configuration 
@ComponentScan(basePackages={"com.ucrisko.*"}, 
    excludeFilters={ 
     @ComponentScan.Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class) 
    }) 
public class RootConfig { 

} 

И мой WebAppConfig

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages={"com.ucrisko.*"}) 
public class WebAppConfig extends WebMvcConfigurerAdapter{ 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
} 

...various other beans 
} 

ответ

5

В Spring Boot вы можете просто определить фильтр в качестве компонента в вашей конфигурации. Я не уверен, что это работает в простой Spring MVC, но вы можете попробовать. Одна неудобная вещь заключается в настройке фильтра из java-кода - вам придется реализовать FilterConfig. Рабочий пример Spring загрузки выглядит следующим образом (фрагмент из класса конфигурации):

@Bean 
public UrlRewriteFilter urlRewriteFilter(final ServletContext servletContext) throws ServletException { 
    UrlRewriteFilter urlRewriteFilter = new UrlRewriteFilter(); 
    urlRewriteFilter.init(new FilterConfig() { 
     private final Map<String, String> params = new HashMap<String, String>(); 
     { 
      params.put("confPath", "urlrewrite.xml"); 
     } 

     @Override 
     public String getFilterName() { 
      return "UrlReriteFilter"; 
     } 

     @Override 
     public ServletContext getServletContext() { 
      return servletContext; 
     } 

     @Override 
     public String getInitParameter(String name) { 
      return params.get(name); 
     } 

     @Override 
     public Enumeration<String> getInitParameterNames() { 
      return Collections.enumeration(params.keySet()); 
     } 
    }); 

    return urlRewriteFilter; 
} 

Что касается регулярного Spring MVC, мне кажется, вы должны реализовать WebApplicationInitializer. WebApplicationInitializer - код Java, эквивалентный конфигурации web.xml. Согласно документации, Spring должна забрать реализации из класса и запустить их. Пример реализации может выглядеть следующим образом (Примечание: я не проверял, если это работает, но он должен установить вы на правильном пути):

public class Initalizer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return null; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] {WebAppConfig.class}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] {"/*", "*.html"}; 
    } 

    @Override 
    protected Filter[] getServletFilters() { 
     UrlRewriteFilter urlRewriteFilter = new UrlRewriteFilter(); 
     /* 
     * Add filter configuration here if necessary 
     */ 
     return new Filter[] {urlRewriteFilter}; 
    } 
} 

AbstractAnnotationConfigDispatcherServletInitializer является реализация Spring по WebApplicationInitializer интерфейса с целью сделать инициализацию DispcherServlet (который является точкой входа Spring MVC). В этом примере WebAppConfig.class - ваш основной класс конфигурации Spring java.

EDIT

Если вы хотите сохранить текущий код инициализации, он должен быть также posssible добавить следующие строки в onStartup метода:

FilterRegistration.Dynamic urlRewriteFilter = servletContext.addFilter("urlRewriteFilter", new UrlRewriteFilter()); 
urlRewriteFilter.setInitParameter("confPath", "urlrewrite.xml"); 
urlRewriteFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD), false, "/*"); 

Этот отрезала основан на ответе доступна здесь : How to do filter mapping in AbstractAnnotationConfigDispatcherServletInitializer Spring

+0

Верхняя часть вашего ответа, по-видимому, работает хотя бы частично. В моем журнале сервера я получаю org.apache.catalina.core.ApplicationContext.log org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: загружен (conf ok) и, похоже, он может найти файл urlrewrite.xml. Тем не менее, у меня нет ссылок на любые URL-адреса, которые были переписаны. Например, следующее не приводит к попытке перенаправления на страницу index.html. ^пользователи <ввести = «перенаправления»> index.html Ravioli87

+0

Если ничего не происходит, то весна, вероятно, просто инициализирует класс UrlRewriteFilter (вызывая сообщения журнала вы видите), но это не на самом деле зарегистрируйте фильтр (другими словами - он не работает). Что произойдет, если вы попытаетесь использовать нижний подход? Как вы запускаете приложение Spring MVC? (например, у вас есть класс, который реализует интерфейс WebApplicationInitializer? Где вы указываете свой основной класс конфигурации javaconfig?) –

+0

Да, у меня есть WebApplicationInitializer, но он немного отличается от того, что у вас есть. Я добавлю это к моему вопросу выше. – Ravioli87

Смежные вопросы