Tuckey URL 重写过滤器 Java Class 配置
Tuckey URL Rewrite Filter Java Class Configuration
我一直在研究如何在 Tomcat 8 上执行 URL 重写并保持 运行ning 为相同的两个建议。
1) 使用 Tuckey URLRewriteFilter。
2) 运行 Apache 在 Tomcat 之上使用 mod_rewrite.
关于前者,URLRewriteFilter 似乎没有任何关于如何以 Java 格式配置而不是 XML 的文档。我的 Spring MVC 应用程序不使用 web.xml 文件 - 所有配置都是通过 Java classes 完成的 - 所以我无法配置XML。
有没有办法以这种方式进行配置,或者除了尝试 运行 Apache on 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 class:
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 引导中,您可以在配置中将过滤器定义为一个 bean。 我不确定这是否适用于普通 Spring MVC,但您可以尝试 。一件尴尬的事情是从 java 代码配置过滤器——你将不得不实现 FilterConfig。一个有效的 Spring 引导示例如下所示(来自配置 class 的片段):
@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 应该从 class 路径和 运行 中获取实现。示例实现可能如下所示(注意:我还没有测试过这是否有效,但它应该会让你走上正确的道路):
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 配置 class.
编辑
如果您希望保留当前的初始化代码,也可以在 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
我一直在研究如何在 Tomcat 8 上执行 URL 重写并保持 运行ning 为相同的两个建议。
1) 使用 Tuckey URLRewriteFilter。 2) 运行 Apache 在 Tomcat 之上使用 mod_rewrite.
关于前者,URLRewriteFilter 似乎没有任何关于如何以 Java 格式配置而不是 XML 的文档。我的 Spring MVC 应用程序不使用 web.xml 文件 - 所有配置都是通过 Java classes 完成的 - 所以我无法配置XML。
有没有办法以这种方式进行配置,或者除了尝试 运行 Apache on 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 class:
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 引导中,您可以在配置中将过滤器定义为一个 bean。 我不确定这是否适用于普通 Spring MVC,但您可以尝试 。一件尴尬的事情是从 java 代码配置过滤器——你将不得不实现 FilterConfig。一个有效的 Spring 引导示例如下所示(来自配置 class 的片段):
@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 应该从 class 路径和 运行 中获取实现。示例实现可能如下所示(注意:我还没有测试过这是否有效,但它应该会让你走上正确的道路):
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 配置 class.
编辑
如果您希望保留当前的初始化代码,也可以在 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