Tomcat的URL映射为何需包含应用名称?能否配置路径重定向?
Tomcat应用访问路径与重定向配置
为什么localhost:8080/Servlet无法访问?
Tomcat中每个部署的Web应用都对应一个上下文路径(Context Path),你部署的App应用的上下文路径就是/App。当访问localhost:8080/App/Servlet时,Tomcat会先通过/App定位到你的App应用,再根据/Servlet找到对应的Servlet实例。
而直接访问localhost:8080/Servlet时,Tomcat会默认去ROOT应用(上下文路径为空的默认应用)里查找名为Servlet的映射,但你的Servlet不在ROOT应用中,因此会返回404错误。
可以配置重定向吗?当然可以,两种常用方案:
方法1:使用Tomcat Rewrite Valve(全局规则)
这是最灵活的无代码修改方案:
- 打开Tomcat安装目录下的
conf/server.xml,找到<Host>标签,添加RewriteValve配置:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 保留原有配置 --> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host>
- 在
conf/Catalina/localhost目录下新建rewrite.config文件,写入重定向规则:
# 将/Servlet重定向到/App/Servlet RewriteRule ^/Servlet$ /App/Servlet [R,L]
[R]表示触发浏览器重定向(地址栏URL会更新),若需内部转发(URL不变),可替换为[P][L]表示匹配该规则后停止后续规则解析
方法2:在ROOT应用中添加重定向Servlet
如果不想修改Tomcat全局配置,可在默认ROOT应用中添加专用重定向Servlet:
- 进入Tomcat的
webapps/ROOT/WEB-INF目录,编辑web.xml,添加以下Servlet配置:
<servlet> <servlet-name>ServletRedirect</servlet-name> <servlet-class>com.example.ServletRedirect</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRedirect</servlet-name> <url-pattern>/Servlet</url-pattern> </servlet-mapping>
- 在
webapps/ROOT/WEB-INF/classes/com/example目录下创建ServletRedirect.java,实现重定向逻辑:
package com.example; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletRedirect extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 重定向到目标Servlet,地址栏URL会更新 response.sendRedirect("/App/Servlet"); // 若需内部转发(URL不变),使用以下代码: // request.getRequestDispatcher("/App/Servlet").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
- 编译该Java类,确保class文件放在对应目录下,重启Tomcat即可生效。
内容的提问来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

