java - Tuckey URL 重写过滤器 Java 类配置

标签 java spring-mvc tomcat spring-annotations tuckey-urlrewrite-filter

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

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

关于前者,URLRewriteFilter 似乎没有任何关于如何以 Java 格式而不是 XML 格式进行配置的文档。我的 Spring MVC 应用程序没有使用 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>

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

}

我的根配置

@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 中,您可以在配置中将过滤器定义为一个 bean。 我不确定这是否适用于普通的 Spring MVC,但您可以尝试。一件尴尬的事情是从 java 代码配置过滤器——你将不得不实现 FilterConfig。一个有效的 Spring Boot 示例如下所示(来自配置类的片段):

@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,您似乎应该实现 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 接口(interface)的实现,旨在简化 DispcherServlet(这是 Spring MVC 的入口点)的初始化。在此示例中,WebAppConfig.class 是您的主要 Spring java 配置类。

编辑

如果您希望保留当前的初始化代码,也可以在 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

关于java - Tuckey URL 重写过滤器 Java 类配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917184/

相关文章:

java - loadResourceasStream 来自项目 java 的子文件夹

Java Spring MVC - java.lang.NoClassDefFoundError : javax/servlet/ServletContext

java - 尝试在 debian 上运行的 tomcat 上加载 servlet 时出现 UnsuportedClassVersionError

java - 使用来自数据源的连接优于 JDBC 驱动程序管理器的优势

java - 无法创建 Java 虚拟机,它表示不支持认可

java - Java8 的蛋糕模式可能吗?

java - 对内容进行建模的设计模式

java - Spring MVC + Thymeleaf - 保存关系@ManyToOne

java - 在用户关闭应用程序后,我将如何恢复上次查看的 Activity ?

java - 找不到类 [org.apache.shiro.spring.LifecycleBeanPostProcessor]