【问题标题】:Custom filter extending UrlRewriteFilter to load rules from database自定义过滤器扩展 UrlRewriteFilter 以从数据库加载规则
【发布时间】:2015-05-16 01:55:12
【问题描述】:

我的项目中有自定义重定向过滤器,它们从数据库加载定义的规则,并处理重定向。

除此之外,我还使用 UrlRewriteFilter ,并在 urlrewrite.xml 中定义了一些规则。

现在我想完全切换到使用 tukey 的过滤器,但是我想从我的数据库中加载规则,而不是在 xml 中定义它们(这样我就可以有一个地方来保存重定向规则)。

我的想法是扩展UrlRewriteFilter,而不是从 XML 文件初始化规则,而是从数据库加载我的规则。

这是我目前所拥有的,

@Service
public class CustomUrlRewriteFilter extends UrlRewriteFilter {

    @Autowired
    private RedirectService redirectService;

    private UrlRewriter urlRewriter;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        super.init(filterConfig);
    }

    @Override
    protected UrlRewriter getUrlRewriter(ServletRequest request, ServletResponse response, FilterChain chain) {
        return urlRewriter;
    }

    @PostConstruct
    public void initUrlRewriter() {

        List<Redirect> redirects = redirectService.retrieveAll();

        Conf conf = new Conf();

        for (Redirect redirect : redirects) {
            NormalRule rule = new NormalRule();

            rule.setMatchType(redirect.getMatchType());
            rule.setToType(redirect.getRedirectType());
            rule.setFrom(redirect.getPath());
            rule.setTo(redirect.getTarget());
            rule.setQueryStringAppend("true");
            conf.addRule(rule);
        }

        conf.setUseQueryString(true);

        urlRewriter = new UrlRewriter(conf);

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
                                                                                             ServletException {
        super.doFilter(req, resp, chain);
    }

}

问题是,重定向没有发生,我没有得到任何异常。当我调试时,我可以看到processing request 返回 false,因为它找不到规则链(可能是我需要以某种方式初始化规则链?)。

我假设我错过了要覆盖的内容,或者我的初始化错误。有没有人有这方面的经验?是否有可能实现正确的行为?

感谢任何帮助。

【问题讨论】:

    标签: java url-rewriting servlet-filters tuckey-urlrewrite-filter


    【解决方案1】:

    所以我终于可以完成这项工作了。

    问题是向Conf 添加规则是不够的,我还必须通过调用conf.initialise() 来初始化这些规则。

    另一方面,conf.initialise() 本身调用NormalRule.initialise(),它正在检查urlrewrite.xml 的存在和有效性,如果它没有正确初始化,它会返回false,并且配置没有正确初始化。

    解决方法是提供扩展NormalRule.initialise() 的自定义规则,当调用initialise() 时,它总是显式返回true

    这里是自定义规则的例子

    public final class CustomRule extends NormalRule {
    
        public CustomRule(RedirectType redirectType, MatchType matchType, String from, String to) {
            super();
    
            setMatchType(matchType);
            setToType(redirectType);
    
            setFrom(from);
            setTo(to);
            setQueryStringAppend("true");
        }
    
        @Override
        public boolean initialise(ServletContext context) {
            super.initialise(context);
            return true;
        }
    
    }
    

    然后在创建UrlRewriter 时我需要初始化配置,就是这样。

    @Service
    public class CustomUrlRewriteFilter extends UrlRewriteFilter {
    
        @Autowired
        private RedirectService redirectService;
    
        private UrlRewriter urlRewriter;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            super.init(filterConfig);
        }
    
        @Override
        protected UrlRewriter getUrlRewriter(ServletRequest request, ServletResponse response, FilterChain chain) {
            return urlRewriter;
        }
    
        @PostConstruct
        public void initUrlRewriter() {
    
            List<Redirect> redirects = redirectService.retrieveAll();
    
            Conf conf = new Conf();
    
            for (Redirect redirect : redirects) {
                CustomRule rule = new CustomRule(
                        redirect.getRedirectType(), redirect.getMatchType(), redirect.getPath(), redirect.getTarget()
                );
                conf.addRule(rule);
            }
    
            conf.setUseQueryString(true);
    
            conf.initialise();
    
            urlRewriter = new UrlRewriter(conf);
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
                                                                                                 ServletException {
            super.doFilter(req, resp, chain);
        }
    
        @Override
        public void destroy() {
            super.destroy();
        }
    
    }
    

    仍然:欢迎评论。

    【讨论】:

      【解决方案2】:

      就我而言,我想使用属性值来构建规则。我找到了一个较短的版本来实现与上述帖子相同的效果。

      @Component
      public class CustomUrlRewriteFilter extends UrlRewriteFilter {
      
        @Value("${sites.cities.codes}")
        private String citiesCodes;
      
        @Override
        protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
          Conf conf = new Conf();
      
          NormalRule rule = new NormalRule();
          rule.setMatchType("regex");
          rule.setName("Remove City param");
          String from = "^/(" +  citiesCodes + ")/?(.*)$";
          rule.setFrom(from);
          rule.setTo("/$2");
      
          conf.addRule(rule);
      
          conf.initialise();
          checkConf(conf);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 2014-03-09
        • 1970-01-01
        • 2014-12-01
        • 2015-09-11
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多