自定义过滤器扩展 UrlRewriteFilter 以从数据库加载规则
Custom filter extending UrlRewriteFilter to load rules from database
我的项目中有自定义重定向过滤器,它们从数据库加载定义的规则,并处理重定向。
除此之外,我还使用 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 它 returns 错误时,因为它找不到规则链(可能是我需要以某种方式初始化规则链?)。
我假设我错过了一些要覆盖的东西,或者我的初始化是错误的。有没有人有这方面的经验?是否有可能完全实现正确的行为?
感谢任何帮助。
所以我终于可以完成这项工作了。
问题是向 Conf
添加规则是不够的,我还必须通过调用 conf.initialise()
来初始化这些规则。
另一方面,conf.initialise()
本身调用 NormalRule.initialise()
检查 urlrewrite.xml
的存在和有效性,如果它没有正确初始化它 returns false
并且配置未正确初始化。
解决方法是提供扩展 NormalRule.initialise()
的自定义规则,它在调用 initialise()
.
时明确 returns 总是 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();
}
}
仍然:欢迎评论。
就我而言,我想使用 属性 值来构建规则。我找到了一个更短的版本来实现与上面相同的效果 post.
@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("/");
conf.addRule(rule);
conf.initialise();
checkConf(conf);
}
}
我的项目中有自定义重定向过滤器,它们从数据库加载定义的规则,并处理重定向。
除此之外,我还使用 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 它 returns 错误时,因为它找不到规则链(可能是我需要以某种方式初始化规则链?)。
我假设我错过了一些要覆盖的东西,或者我的初始化是错误的。有没有人有这方面的经验?是否有可能完全实现正确的行为?
感谢任何帮助。
所以我终于可以完成这项工作了。
问题是向 Conf
添加规则是不够的,我还必须通过调用 conf.initialise()
来初始化这些规则。
另一方面,conf.initialise()
本身调用 NormalRule.initialise()
检查 urlrewrite.xml
的存在和有效性,如果它没有正确初始化它 returns 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();
}
}
仍然:欢迎评论。
就我而言,我想使用 属性 值来构建规则。我找到了一个更短的版本来实现与上面相同的效果 post.
@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("/");
conf.addRule(rule);
conf.initialise();
checkConf(conf);
}
}