2

我在我的項目中有自定義重定向過濾器,它們正在從數據庫加載定義的規則,並處理重定向。自定義過濾器擴展UrlRewriteFilter從數據庫中加載規則

除此之外,我還使用UrlRewriteFilter,其中一些規則在urlrewrite.xml中定義。

現在我想完全切換使用tuckey的過濾器,但是我想從我的數據庫加載規則,而不是讓他們在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,因爲它找不到規則鏈(是否需要以某種方式初始化規則鏈?)。

我假設我錯過了一些重寫,或者我的初始化是錯誤的。有沒有人有這方面的經驗?是否有可能實現適當的行爲?

任何幫助表示讚賞。

回答

1

因此,最終我可以設法得到這項工作。

問題在於向Conf添加規則是不夠的,我還必須通過調用conf.initialise()來啓動這些規則。

另一方面,conf.initialise()本身調用NormalRule.initialise()這是檢查urlrewrite.xml的存在和有效性,如果它不能正常initilized返回false和配置不正確initilizing。

解決方法是提供擴展爲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我需要initiliaze配置時的例子,這就是它。

@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(); 
    } 

} 

還有:評論歡迎。

相關問題