每次请求都可以更改上下文路径吗?

时间:2015-09-24 09:41:40

标签: java tomcat heroku openshift contextpath

我正在开发一个Web应用程序,发生了一些非常奇怪的事情。我在我的本地tomcat上运行我的JEE应用程序,一切顺利。当我在线部署我的应用程序时(在Heroku或Openshift上),每个请求都会更改上下文路径。例如,如果我点击链接,应用程序会正确显示我期望的内容,但从现在开始,上下文路径(我在JSP中用于生成链接)更改为当前URL。如果我将浏览器中的网址修改为网站的主页面,它会再次更改。可能是配置问题?我头疼。 我正在使用urlrewrite来设置漂亮的网址,因此,如果我网站的主页是http://homesite/,则会在http://homesite/article/year/month/article_slug上刊登一篇文章。在主页上,当我单击链接查看文章时,页面会相应更改。页面更改后,如果单击菜单中的“主页”链接(使用$ {pageContext.request.contextPath}生成),它将转到我已经使用的同一页面。 在网站的每个页面中,我都添加了一个javascript变量:

<script type="text/javascript">
    context = "<%=request.getContextPath()%>";
</script>

这里的contextpath总是空的,因为它必须是,我相信。 这是生成我站点主菜单的JSP的内容:

<nav class="red accent-4">
    <div id="uc-nav-menu-container" class="nav-wrapper">
        <!--<a href="#" class="brand-logo right">Unical Coin</a>-->
        <a href="#" data-activates="mobile-demo" class="button-collapse left"><i class="material-icons">menu</i></a>
        <ul id="nav-mobile" class="left hide-on-med-and-down">
            <li class="active"><a href="${pageContext.request.contextPath}">Home</a></li>
            <li><a href="#">Mission</a></li>
            <li><a href="#">Tecnologia</a></li>
            <li><a href="#">About</a></li>
            <li><a href="#">Links</a></li>
        </ul>
        <ul class="red accent-4 side-nav" id="mobile-demo">
            <li class="active"><a href="${pageContext.request.contextPath}">Home</a></li>
            <li><a class="white-text" href="#">Mission</a></li>
            <li><a class="white-text" href="#">Tecnologia</a></li>
            <li><a class="white-text" href="#">About</a></li>
            <li><a class="white-text" href="#">Links</a></li>
        </ul>
        <div id="uc-user-menu-container" class="right"></div>
    </div>
</nav>

这是生成文章页面的JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
         pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <jsp:include page="/WEB-INF/components/imports/default-head-imports.jsp"></jsp:include>
    </head>
    <body class="blue-grey lighten-5">
        <jsp:include page="/WEB-INF/components/nav-menu.jsp"></jsp:include>
        <div class="container">
            <jsp:include page="/WEB-INF/components/single-article-content.jsp"></jsp:include>
        </div>
        <jsp:include page="/WEB-INF/components/footer.jsp"></jsp:include>
        <jsp:include page="/WEB-INF/components/imports/default-foot-imports.jsp"></jsp:include>
    </body>
</html>

每个页面中的javascript变量仅在包含的“/WEB-INF/components/imports/default-head-imports.jsp”中生成。

1 个答案:

答案 0 :(得分:0)

这里的问题是ROOT应用程序的上下文路径实际上是&#34;&#34; (空字符串)而不是/正如您所料。如果您将应用程序部署为ROOT,那么您将获得您的主页&#34;链接看起来像这样:

<li class="active"><a href="">Home</a></li>

如果您点击该链接,那么您将在当前页面上结束。

如果您真的想要转到当前上下文的根目录,那么您的链接需要像这样完成:

<li class="active"><a href="${pageContext.request.contextPath}/">Home</a></li>

请注意/属性中的追踪href

如果您要对用户进行身份验证,您还应该使用正确的链接编码来保护用户&#39;会话如果没有cookie:

<li class="active"><a href="$response.encodeURL("${pageContext.request.contextPath}/")">Home</a></li>

(这可能不是有效的EL ......我没有EL专家,但你明白了。)

哦,虽然/可能是&#34;合法的&#34;上下文路径,它不太可能给你你期望的结果。永远不要在path元素中添加<Context>,除非您绝对必须,否则永远不要在<Context>中放置server.xml元素。相反,使用WAR文件的名称或部署描述符XML的文件名在所需的路径上部署上下文,如果您希望它是根Web应用程序,则包括ROOT