Tuckey URL重写过滤器Java类配置

Tuckey URL重写过滤器Java类配置,java,spring-mvc,tomcat,spring-annotations,tuckey-urlrewrite-filter,Java,Spring Mvc,Tomcat,Spring Annotations,Tuckey Urlrewrite Filter,我一直在研究如何在Tomcat8上执行URL重写,并不断遇到相同的两个建议 1) 使用Tuckey过滤器。 2) 在Tomcat上运行Apache以使用mod_rewrite 对于前者,URLRewriteFilter似乎没有任何关于如何以Java格式而不是XML格式进行配置的文档。我的SpringMVC应用程序没有使用web.xml文件——所有配置都是通过Java类完成的——因此我无法使用xml进行配置 除了尝试在Tomcat上运行Apache之外,有没有其他方法可以用这种方式进行配置呢 例如

我一直在研究如何在Tomcat8上执行URL重写,并不断遇到相同的两个建议

1) 使用Tuckey过滤器。 2) 在Tomcat上运行Apache以使用mod_rewrite

对于前者,URLRewriteFilter似乎没有任何关于如何以Java格式而不是XML格式进行配置的文档。我的SpringMVC应用程序没有使用web.xml文件——所有配置都是通过Java类完成的——因此我无法使用xml进行配置

除了尝试在Tomcat上运行Apache之外,有没有其他方法可以用这种方式进行配置呢

例如,有没有一种方法可以用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>
我的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
}

在SpringBoot中,您可以在配置中将过滤器定义为bean。我不确定这是否适用于纯Spring MVC,但您可以试试。一件棘手的事情是从java代码配置过滤器-您必须实现FilterConfig。工作的Spring引导示例如下所示(来自config类的代码片段):

AbstractAnnotationConfigDispatcherServletInitializer
是Spring对
WebApplicationInitializer
接口的实现,旨在简化
DispatcherServlet
(Spring MVC的入口点)的初始化。在本例中,
WebAppConfig.class
是您的主要SpringJava配置类

编辑

如果您希望保留当前的初始值设定项代码,也可以在
onStartup
方法中添加以下行:

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

此截图基于此处提供的答案:

答案的顶部似乎至少部分有效。在我的服务器日志中,我得到了org.apache.catalina.core.ApplicationContext.log org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO:loaded(conf ok),它似乎能够找到我的urlrewrite.xml文件。然而,我不会以任何URL被重写而告终。例如,以下内容不会以尝试重定向到index.html页面而告终^users index.html如果什么都没有发生,那么Spring可能只是实例化URLRewiteFilter类(导致您看到的日志消息),但它实际上没有注册过滤器(换句话说,它不工作)。如果尝试底部方法会发生什么?您是如何启动Spring MVC应用程序的?(例如,您是否有一个实现WebApplicationInitializer接口的类?您在哪里指定主javaconfig配置类?)是的,我有一个WebApplicationInitializer,但它看起来与您的有些不同。我将把它添加到上面的问题中。我编辑了代码示例以匹配您当前的
WebApplicationInitializer
AbstractAnnotationConfigDispatcherServletializer
似乎是Spring首选的初始化
DispatcherServlet
的方法,它还使注册过滤器变得更容易。如果您希望保留自己的实现,然后查看
AbstractAnnotationConfigDispatchersServletInitializer
的源代码,并查看它是如何使用
getServletFilters
注册过滤器的。我还编辑了我的答案,以包含适用于当前
WebApplicationInitializer
@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;
}
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};
    }
}
FilterRegistration.Dynamic urlRewriteFilter = servletContext.addFilter("urlRewriteFilter",  new UrlRewriteFilter());
urlRewriteFilter.setInitParameter("confPath", "urlrewrite.xml");
urlRewriteFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD), false, "/*");