微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tuckey URL重写过滤器Java类配置

如何解决Tuckey URL重写过滤器Java类配置

在Spring Boot中,您只需在配置中将filter定义为bean。 我不确定这是否可以在普通的Spring MVC中使用,但是您可以尝试 。一件尴尬的事情是从Java代码配置过滤器-您将必须实现FilterConfig一个有效的Spring Boot示例如下(来自config类的片段):

@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接口实现,旨在简化初始化dispcherServlet(这是Spring MVC的入口点)。在这个例子中WebAppConfig.class是您的主要Spring java config类。

如果您希望保留当前的初始化程序代码,也可以在onStartup方法添加以下行:

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

解决方法

我一直在研究如何在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");
}

}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。