Tomcat UrlRewriteFilter 部署项目虚拟路径配置,路由重写,可参考配置部署前端控制路由项目(Vue,React 等)

Tomcat UrlRewriteFilter 部署项目虚拟路径配置,路由重写,可参考配置部署前端控制路由项目(Vue,React 等)

环境:Windows 11apache-tomcat-8.5.78

1. 例:有以下 myapp 项目包:

复制代码
/tomcat/
 └── webapps/
     └── myapp/
         ├── WEB-INF/
         │   └── web.xml
         ├── index.html
         └── my.html
html 复制代码
<!-- 以下为 index.html 内容 -->
<!-- my.html 与 index.html 内容基本相同,仅为演示非index.html命名的文件也能被正常配置访问 -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Index</title>
  <style>
    html,
    body,
    h1 {
      margin: 0;
    }

    html,
    body {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 100%;
      height: 100%;
      background: url(/static/img/bg.png) center no-repeat;
      background-size: 100% 100%;
    }

    .h1 {
      color: gold;
      width: 80vw;
      text-align: center;
      margin: 0 auto;
    }

    .h1.white {
      color: white;
      margin-bottom: 30px;
    }
  </style>
</head>

<body>
  <script>
    document.write(`<h1 class="h1 white">index.html</h1><h1 class="h1">访问路径:${window.location.pathname}</h1>`)
  </script>
</body>

</html>
xml 复制代码
<!-- 以下为 web.xml 内容 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
				http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
				version="3.1">

	<!-- SERVLET 启动初始化 -->
	<servlet>
			<servlet-name>default</servlet-name>
			<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
			<init-param>
					<param-name>listings</param-name>
					<param-value>false</param-value>
			</init-param>
			<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.js</url-pattern>  
 	</servlet-mapping> 
   	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.css</url-pattern>  
 	</servlet-mapping>  
 	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.gif</url-pattern>  
 	</servlet-mapping>
 	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.jpg</url-pattern>  
 	</servlet-mapping> 
 	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.png</url-pattern>  
 	</servlet-mapping> 
 	<servlet-mapping>  
     <servlet-name>default</servlet-name>  
     <url-pattern>*.html</url-pattern>
 	</servlet-mapping> 

</web-app>

2. 启动Tomcat进行访问

  • 访问:http://localhost/myapp/
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp/index.html
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp/my.html
  • 响应:my.html 对应资源
  • 访问:http://localhost/myapp/index
  • 响应:404

3. 通过配置虚拟路径,移除项目路由前缀 /myapp 和 新增路由前缀 /myapp-custom

  • 配置 tomcat/conf/server.xml
xml 复制代码
<!-- 找到server.xml中Host标签,并插入Context标签配置,如下 -->
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

    <!-- other code ... -->

    <!-- 配置 / 路由 要映射到的项目目录 -->
    <Context path="/" docBase="C:\tomcat\webapps\myapp" reloadable="false" ></Context >

    <!-- 配置  /myapp-custom 路径 要映射到的项目目录,此处与 / 路由资源映射相同 -->
    <Context path="/myapp-custom"  docBase="C:\tomcat\webapps\myapp" reloadable="false" ></Context >

    <!-- other code ... -->
    
</Host>

4. 重启 Tomcat 访问测试

  • 访问:http://localhost/
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp/
  • 响应:index.html 对应资源
  • 访问:http://localhost/my.html
  • 响应:my.html 对应资源
  • 访问:http://localhost/myapp-custom/
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp-custom/index.html
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp-custom/my.html
  • 响应:my.html 对应资源

5. 通过配置 Servlet + UrlRewriteFilter 自定义路由访问指定资源

  • 配置 tomcat/webapps/myapp/WEB-INF/web.xml

    xml 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                  version="3.1">
          <!-- SERVLET 启动初始化 -->
          <servlet>
                  <servlet-name>default</servlet-name>
                  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
                  <init-param>
                          <param-name>listings</param-name>
                          <param-value>false</param-value>
                  </init-param>
                  <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.js</url-pattern>  
          </servlet-mapping> 
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.css</url-pattern>  
          </servlet-mapping>  
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.gif</url-pattern>  
          </servlet-mapping>
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.jpg</url-pattern>  
          </servlet-mapping> 
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.png</url-pattern>  
          </servlet-mapping> 
          <servlet-mapping>  
          <servlet-name>default</servlet-name>  
          <url-pattern>*.html</url-pattern>
          </servlet-mapping> 
    
          <!-- 路由映射 -->
          <servlet-mapping>
              <servlet-name>default</servlet-name>
              <url-pattern>/myapp-web/*</url-pattern>
          </servlet-mapping>
    
          <!-- 应用 UrlRewriteFilter -->
          <filter>
                  <filter-name>UrlRewriteFilter</filter-name>
                  <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
                  <init-param>
                      <param-name>logLevel</param-name>
                      <param-value>WARN</param-value>
                  </init-param>
          </filter>
          <filter-mapping>
              <filter-name>UrlRewriteFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
    
      </web-app>
  • 配置 UrlRewriteFilter,在 tomcat/webapps/myapp/WEB-INF/ 目录下新增配置文件 urlrewrite.xml

    xml 复制代码
    <?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
          "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
    
      <!--
          Configuration file for UrlRewriteFilter
          http://tuckey.org/urlrewrite/
    
      -->
      <urlrewrite>
          <rule>
              <note>
                  The rule means that requests to /test/status/ will be redirected to /rewrite-status
                  the url will be rewritten.
              </note>
              <from>/test/status/</from>
              <to type="redirect">%{context-path}/rewrite-status</to>
          </rule>
    
          <outbound-rule>
              <note>
                  The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
                  the url /rewrite-status will be rewritten to /test/status/.
    
                  The above rule and this outbound-rule means that end users should never see the
                  url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
                  in your pages.
              </note>
              <from>/rewrite-status</from>
              <to>/test/status/</to>
          </outbound-rule>
    
          <!-- 配置将 /myapp-web 映射到资源 my.html -->
          <rule>
              <from>^/myapp-web$</from>
              <to>/my.html</to>
          </rule>
    
      </urlrewrite>
  • 下载 UrlRewriteFilter, 官方下载

  • 将下载的 urlrewrite-x.x.x.jar 文件复制到 tomcat/lib/ 目录下

  • 最终目录结构

    复制代码
    /tomcat/
    ├── lib/
    │    ├── ... other jar
    │    ├── urlrewrite-x.x.x.jar
    │    └── ... other jar
    └── webapps/
       └── myapp/
           ├── WEB-INF/
           │   ├── urlrewrite.xml
           │   └── web.xml
           ├── index.html
           └── my.html
  • UrlRewriteFilter 官网

6. 重启 Tomcat 访问测试

  • 访问:http://localhost/
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp/
  • 响应:index.html 对应资源
  • 访问:http://localhost/my.html
  • 响应:my.html 对应资源
  • 访问:http://localhost/myapp-custom/
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp-custom/index.html
  • 响应:index.html 对应资源
  • 访问:http://localhost/myapp-custom/my.html
  • 响应:my.html 对应资源
  • 访问:http://localhost:8888/myapp-web
  • 响应:my.html 对应资源
  • 访问:http://localhost/myapp-custom/myapp-web
  • 响应:my.html 对应资源
  • 访问:http://localhost/myapp-custom/myapp-web/my.html
  • 响应:404
相关推荐
counting money2 天前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
步行cgn4 天前
MyBatis 动态 SQL 完全指南
sql·tomcat·mybatis
SemiTris5 天前
从Controller到Tomcat底层请求链路全解析
java·tomcat
程序员良辰6 天前
【TongWeb8】使用 Crontab 定时重启和检测 TongWeb 服务
java·中间件·tomcat
上海云盾商务经理杨杨6 天前
Tomcat 弱配置漏洞渗透实战!批量 getshell 高频漏洞
java·web安全·tomcat
小张同学a.10 天前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
xxwl58515 天前
数据库后端接口测试报告
spring boot·mysql·tomcat
次次皮17 天前
Linux 下通过 XShell 手动更新 Tomcat 应用并重启
前端·tomcat·jar
Listen·Rain19 天前
用AI开发出一个AI
java·人工智能·spring boot·tomcat·intellij-idea·mybatis·visual studio
Full Stack Developme20 天前
SpringBoot 内嵌 Tomcat 的启动流程
spring boot·后端·tomcat