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,似乎应该实现WebApplicationInitializer
。 WebApplicationInitializer
是与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映射