【问题标题】:Using UrlRewriteFilter to remove .html extension from page? – Using GAE使用 UrlRewriteFilter 从页面中删除 .html 扩展名? – 使用 GAE
【发布时间】:2016-04-18 00:36:15
【问题描述】:

让我的网址正确写入有点困难。我刚刚发现了UrlRewriteFilter,它似乎正是我所需要的,因为使用带有 GAE 的 Java 重写 url 有点困难(使用 python/go 和 app.yaml 非常简单,但是使用 Java 是一个主要的痛苦出于某种原因,我必须使用Java)。这就是我所拥有的——

<rule>
    <from>^/test.html$</from>
    <to>/test</to>
</rule>

我只是希望人们能够输入mysite.com/test 而不是mysite.com/test.html。我会以正确的方式解决这个问题吗?当我使用上面的这段代码时,我得到一个由java.lang.StackOverflowError 引起的HTTP ERROR 500

任何帮助将不胜感激!谢谢。

【问题讨论】:

    标签: java google-app-engine url-rewriting


    【解决方案1】:

    在研究您的other question 期间,我尝试使用 Paul Tuckey 的 UrlRewriteFilter。这对我来说效果不佳,原因有两个。

    • 我不喜欢使用 UrlRewriteFilter 过滤所有请求的想法,因为所有请求都必须通过应用引擎实例进行路由,因此会切断内容交付网络
    • 我可能是错的,但如果我没记错的话,在我对 UrlRewriteFilter 的快速讨论中,我发现过滤器在内部转发到静态内容,这不起作用,因为 appengine 实例本身没有设置为服务静态内容 - 只有内容交付网络才能做到这一点。

    我最近做的事情是这样的:

    public class RewriteFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
            log.info("Proxy Servlet for: " + httpServletRequest.getRequestURI());
    
            byte[] buffer = new byte[1024];
            try (InputStream is = new FileInputStream("index.html"); OutputStream os = httpServletResponse.getOutputStream()) {
                int read = is.read(buffer);
                while (read > 0) {
                    os.write(buffer, 0, read);
                    read = is.read(buffer);
                }
    
            }
    
            // chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    虽然真的很难看,但即使只是针对 index.html 页面(我可以使用过滤器初始化参数并定义多个过滤器来改变它),这也有效。

    但为什么它在 UrlRewriteFilter 不起作用的地方起作用?

    答案很简单。此过滤器 servlet 不会在内部转发到静态内容,而是为内容本身提供服务。由于此过滤器只会对我在 web.xml 中 &lt;filter-mapping&gt; 下方的 &lt;url-pattern&gt; 指定的 url 生效,因此通过此过滤器提供服务时,我可以忍受轻微的性能下降。如果有人找到更好的方法,请发表评论。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2017-05-08
      • 2021-12-08
      • 1970-01-01
      • 2016-12-28
      • 2014-03-04
      • 2015-03-20
      相关资源
      最近更新 更多