【问题标题】:Jetty RewriteRegexRule fail to extract the query stringJetty RewriteRegexRule 提取查询字符串失败
【发布时间】:2016-01-12 12:24:14
【问题描述】:

我正在尝试创建一个重定向规则来处理以下地址:

http://localhost/authorize/facebook?code=123456

http://localhost/authorize/facebook/123456

为了完成这个要求,我正在使用 JettyJetty Rewrite 的版本 9.3.6.v20151106。在我的代码中,我使用以下配置:

    // Rewrite.
    RewriteHandler rewriteHandler = new RewriteHandler();
    rewriteHandler.setOriginalPathAttribute("requestedPath");

    // Rewrite regex rule.
    RewriteRegexRule rewriteRegexRule = new RewriteRegexRule();
    rewriteRegexRule.setRegex("/authorize/([^\\?]+)\\?code=(.*)$");
    rewriteRegexRule.setReplacement("/authorize/$1/$2");
    rewriteHandler.addRule(rewriteRegexRule);

    // Rewrite handler.
    try {
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[]{rewriteHandler, webAppContextHandler});
        jettyServer.setHandler(handlers);

但是,尽管它是一个有效且正确的正则表达式模式,但在与 Jetty Rewrite 一起使用时却不匹配。我尝试逐步创建此模式,但当我在模式中包含 \\? 时,它总是停止工作。

有人可以帮我解决这条规则吗?

【问题讨论】:

    标签: java regex url-rewriting embedded-jetty jetty-9


    【解决方案1】:

    问题在于 RewriteRegexRule 只考虑与正则表达式模式匹配的 URL 路径。为了解决此问题,我实现了自己的正则表达式规则,如下所示:

    @Override
    protected String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException {
    
        String finalURL = replacement;
    
        // Replace all $n placeholder by matcher group values.
        for (int index = 1; index <= matcher.groupCount(); index++) {
    
            String group = matcher.group(index);
            if (group == null) {
                group = new String();
            } else {
                group = Matcher.quoteReplacement(group);
            }
    
            finalURL = finalURL.replaceAll("\\$" + index, group);
        }
    
        // Replace all $<parameter> by query string parameters.
        for (String parameterName : request.getParameterMap().keySet()) {
    
            String parameterValue = (String) request.getParameter(parameterName);
            finalURL = finalURL.replaceAll("\\$" + parameterName, parameterValue);
    
        }
    
        return finalURL;
    
    }
    

    我在考虑它是否对其他人有用,并创建一个对项目的贡献的拉取请求。大家觉得呢?

    【讨论】:

    • 能否将拉取请求链接添加到您的帖子中?
    猜你喜欢
    • 2014-01-31
    • 2011-08-30
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多