gpt4 book ai didi

java - 自定义过滤器扩展 UrlRewriteFilter 以从数据库加载规则

转载 作者:行者123 更新时间:2023-11-30 11:07:09 27 4
gpt4 key购买 nike

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

除此之外,我还使用 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,因为它找不到规则链(可能是我需要以某种方式初始化规则链吗?)。

我想我错过了一些要覆盖的东西,或者我的初始化是错误的。有没有人有这方面的经验?是否有可能完全实现正确的行为?

感谢任何帮助。

最佳答案

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

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

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

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

这里是自定义规则的例子

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

}

仍然:欢迎发表评论。

关于java - 自定义过滤器扩展 UrlRewriteFilter 以从数据库加载规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29034687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com