Tuckey URL重写filterJava类配置

我一直在研究如何在Tomcat 8上执行URL重写并继续运行相同的两个建议。

1)使用Tuckey URLRewriteFilter。 2)在Tomcat之上运行Apache以使用mod_rewrite。

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

有没有办法以这种方式配置,或者除了尝试在Tomcat之上运行Apache之外还有什么好的选择吗?

例如,有没有办法在Java中实现这一点而不是XML:

 UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter   UrlRewriteFilter /* REQUEST FORWARD  

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

在Spring Boot中,您可以在配置中将filter定义为bean。 我不确定它是否适用于普通的Spring MVC,但你可以试试 。 一个尴尬的事情是从java代码配置filter – 您必须实现FilterConfig。 一个有效的Spring Boot示例如下所示(来自config类的片段):

 @Bean public UrlRewriteFilter urlRewriteFilter(final ServletContext servletContext) throws ServletException { UrlRewriteFilter urlRewriteFilter = new UrlRewriteFilter(); urlRewriteFilter.init(new FilterConfig() { private final Map params = new HashMap(); { 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 getInitParameterNames() { return Collections.enumeration(params.keySet()); } }); return urlRewriteFilter; } 

对于常规的Spring MVC,似乎应该实现WebApplicationInitializerWebApplicationInitializer是与web.xml配置等效的java代码。 根据文档,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配置类。

编辑

如果您希望保留当前的初始化代码,那么在onStartup方法中添加以下行也应该是onStartup

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

这个剪辑基于这里提供的答案: 如何在AbstractAnnotationConfigDispatcherServletInitializer Spring中进行filter映射