本地服务器和 tomcat 之间的 url 上下文更改
Posted
技术标签:
【中文标题】本地服务器和 tomcat 之间的 url 上下文更改【英文标题】:url context changing between local server and tomcat 【发布时间】:2013-05-13 04:43:11 【问题描述】:您好,我正在开发一个有奇怪问题的应用程序。该应用程序在本地 tomcat 和远程 tomcat 部署中都可以正常工作,但在某些模块上,url 上下文会发生变化。
这是其中一个例子:
首先我在我的Web.xml
中有这个以消除疑问:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
我有以下表格:
<form name="cra" th:action="@'/customer/relations/add/'" method="POST">
<input type="hidden" name="craAcctCustNbr"/>
<input type="hidden" name="craChildAcctCustNbr"/>
</form>
由 javascript 调用。请注意,我使用的是 Thymeleaf 标签。通常这会修复 url,使其位于应用程序的上下文中。
现在在我的本地实例中,这转换为localhost:8080/customer/relations/add
,它可以很好地转到我的 spring mvc 控制器。但是,在应用程序位于上下文testapp
下的远程tomcat 部署中,它应该转换为XX.XX.XXX.XX:8080/testapp/customer/relations/add
。情况并非如此,而是这样做:XX.XX.XXX.XX:8080/customer/relations/add
,然后产生带有消息 The requested resource (/customer/account-relations/add/) is not available.
的 404。应用程序的其余部分在远程部署服务器上运行良好,并且保持在上下文中。
经检查,当我打开页面并检查源时,它被正确定义为:
<form name="cra" method="POST" enctype="application/x-www-form-urlencoded" action="/testapp/customer/relations/add/">
<input type="hidden" name="craAcctCustNbr" />
<input type="hidden" name="craChildAcctCustNbr" />
</form>
但是,当动作发生时,它会进入我刚才解释的内容。
我无法检查应用程序日志,我不确定这是 tomcat 问题、spring security 问题还是 thymeleaf 问题。
关于我如何解决这个问题的任何线索?否则我将不得不坚持访问远程日志,这将花费我一些时间来获取访问它们的凭据。
【问题讨论】:
第一步,使用 Firebug 或其他工具检查传出请求 URL。如果其中包含正确的上下文,您就会知道在服务器端查看。如果没有,那么客户端。它还可能显示重定向到不正确的 URL,这可能会提供额外的提示。 您是否尝试将 th:action 设置为 th:action="@'/testapp/customer/relations/add/'" 以查看它是否有效?我知道这不是正确的做法,但请尝试一下。 好吧,这很奇怪,但显然我的应用程序现在运行良好。我没有做任何修复它。这很古怪。我只是在周末保持原样。可能是服务器问题? 【参考方案1】:考虑到已经到达包含表单的页面,您可以简单地使用“核心”标签库来解析表单的上下文:
<html xmlns:c="http://java.sun.com/jsp/jstl/core"> ...
还有……
<c:url value="/customer/relations/add/" var="customerUrl" />
<form name="cra" method="POST" enctype="application/x-www-form-urlencoded" action="$customerUrl">
【讨论】:
我正在使用百里香叶。请参阅我对其他答案的评论。【参考方案2】:每当您尝试访问 url 或将数据发布到 url 时,请使用
"$pageContext.request.contextPath/customer/..."
或者你需要包含 JSTL 代码
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
并使用 c:url 标签指定 URL,如
<c:url value="/customer/relations/add/"/>
【讨论】:
百里香叶不需要这个。请记住,我没有为 JSP 使用传统的视图解析器。问题是别的。【参考方案3】:问题出在服务器端。显然有一些缓存没有被刷新,所以对我的 html/thymeleaf 的更改没有通过。请注意,这也可能是不干净的代码问题,也可能是本地浏览器缓存。
【讨论】:
以上是关于本地服务器和 tomcat 之间的 url 上下文更改的主要内容,如果未能解决你的问题,请参考以下文章
从虚拟主机的 URL 中删除 Tomcat 上下文(mod_jk、mod_rewrite)
从虚拟主机的URL中删除Tomcat上下文(mod_jk,mod_rewrite)
作为 Gradle Build 的一部分运行本地 Apache Web Server + Tomcat