Jetty嵌入开发路径问题

我都知道在使用jetty在嵌入开发的时候使用 ContextHandler ,通过 setContextPath 设置访问路径,通过 setHandler 来使用自定义的handler.最终设置到 Server 中,服务就可以跑起来了。

官方的栗子

       Server server = new Server(8080);
        ContextHandler context = new ContextHandler("/");
        context.setContextPath("/");
        context.setHandler(new HelloHandler("Root Hello"));

        ContextHandler contextFR = new ContextHandler("/fr");
        contextFR.setHandler(new HelloHandler("Bonjoir"));

        ContextHandler contextIT = new ContextHandler("/it");
        contextIT.setHandler(new HelloHandler("Bongiorno"));

        ContextHandler contextV = new ContextHandler("/");
        contextV.setVirtualHosts(new String[] { "127.0.0.2" });
        contextV.setHandler(new HelloHandler("Virtual Hello"));
        contextV.setInitParameter("dirAllowed", "false");

        ContextHandlerCollection contexts = new ContextHandlerCollection();
        contexts.setHandlers(new Handler[] { context, contextFR, contextIT,
                contextV });

        server.setHandler(contexts);

        server.start();
        server.join();

开始

细心的朋友可能在使用中发现,明明我定义的路径是 /user ,但是在访问的时候却进行了一次302跳转,然后最终变成了 /user/ ,经过调试发现,在 ContextHandler 这个类中发现下面这个有趣的问题

        // Are we not the root context?
        // redirect null path infos
        if (!_allowNullPathInfo && _contextPath.length() == target.length() && _contextPath.length()>1)
        {
            // context request must end with /
            baseRequest.setHandled(true);
            if (baseRequest.getQueryString() != null)
                response.sendRedirect(URIUtil.addPaths(baseRequest.getRequestURI(),URIUtil.SLASH) + "?" + baseRequest.getQueryString());
            else
                response.sendRedirect(URIUtil.addPaths(baseRequest.getRequestURI(),URIUtil.SLASH));
            return false;
        }

注释已经写了, context request must end with /
原来jetty会自动得帮你把在请求后面加一个 / ,然后再跳转到你的路径上面,于是 /user 的访问就变成了 /user/

最后

那么如何解决这个问题呢?很简单,只需要调用 setAllowNullPathInfo 这个方法,并且设置为 true 即可
那么jetty 路径自动增加/的问题,也就是jetty自动302的问题就算解决啦!!

你可能感兴趣的:(Jetty嵌入开发路径问题)