没有静态资源的SpringMVC根路径访问处理 过滤器filter 浅谈tomcat路径配置原理

本文探讨了前后端分离项目中,如何配置前端与后端的路径,解决前端不完整路径访问及根路径访问的问题。通过调整Tomcat服务器配置与SpringMVC默认资源加载方式,实现了前端项目的正确访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近工作中,遇到一个新的问题。在前后端分离的项目中,前端项目解压包放在后端项目解压包的根目录下,前端与后端项目路径如下图所示:

 

 

 

 

在访问项目时候,浏览器应该根据前端的url来进行访问,如下图示:

先访问整个项目得根路径(也就是后端得war包解压包,/mtd-webapp),通过此再访问前端项目根路径(/dist),由此来访问前端页面,最终调用后台接口,实现前后端分离项目的访问。

问题1:

此时当我输入的不是完整的前端路径,而是一个不完整路径时,正常来说,是访问不了任何资源的,但是此时由于全端项目会对此类型的请求做一个封装处理,最终还是可以访问到默认的资源,如下图:

 

所以对于问题1:前端中的不完整路径访问,是可以通过前端封装进行处理的。

 

问题2:

如果此时我访问的是整个项目的根路径,也就是后端的根路径,如下图所示:

 

为了解决问题2,我研究了关于tomcat服务器默认加载的资源已经SpringMVC的默认加载资源两部分的内容。

一、关于tomcat服务器默认加载资源的测试

 

此时我启动tomcat并且访问tomcat的根路径:localhost:8080/时,其实tomcat是会默认访问/webapps下的ROOT资源下的index.jsp

 

为什么会默认访问/webapps下的资源呢?因为这个是根据tomcat的server.xml配置文件中设定好的:

 

所以,如果想要启动tomcat时会默认访问的不是ROOT文件夹下的资源,可以通过以下设置达到:

 

二、springMVC默认加载资源

当我访问spring项目的根路径,发觉回报404错误,如下图示:

根据spring项目中的web.xml的配置文件,我找到了这个答案,web.xml的配置如下图所示:

由此我再去查看我在tomcat下发布项目根路径,是否存在此资源,我发觉是缺乏以上类型的资源,所以这也是为何访问报404的原因:

此时我手动加上index文件资源:

此时再进行访问,如下图所示:

 

由此,我们已经大概能理解springMVC与tomcat的根路径相关内容了。为了解决我的问题,我做了以下处理:

在后端的servlet中新增过滤器,过滤路径如下图所示

<!--用于处理非标准的前端url请求过滤器 begin-->
  <filter>
    <filter-name>urlHandlerFilter</filter-name>
    <filter-class>com.csair.mtd.common.filter.UrlHandlerFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>urlHandlerFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--用于处理非标准的前端url请求过滤器 end-->

过滤器的处理如下图所示:

public class UrlHandlerFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse repon = (HttpServletResponse) response;
		//对请求进行封装
		String requestStr = req.getRequestURI();
		String contexgPath = req.getContextPath();
		String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + contexgPath + "/";
		String[] params = requestStr.split("/");
		String ssoParam = req.getParameter("com.trs.idm.gSessionId");
		int len = params.length;
		//todo 暂时只对一种特殊情况的url做处理,如果后续还有其他情况的url需要处理 可以新增代码
		if (params[len - 1].equals("mtd-webapp")) {
			repon.sendRedirect(basePath + "dist/#/Home");
			return;
		}
		if(ssoParam != null && !ssoParam.equals("")){
				repon.sendRedirect(basePath + "dist/#/Home");		//暂时做简单处理
				return;
		}
		chain.doFilter(req,repon);
	}

	@Override
	public void destroy() {

	}
}

此时再次访问项目根路径,就可以实现自动重定向跳转了。

 

### web.xml 中配置无法正确过滤 server.xml 设置的虚拟路径的问题解决方案 当遇到 `web.xml` 的过滤器未能正常处理由 `server.xml` 定义的虚拟路径的情况时,可能的原因在于 Tomcat 的加载顺序以及开发环境中的额外配置需求。以下是详细的分析与解决方案: #### 1. **Tomcat 加载机制的影响** Tomcat 在启动过程中会优先读取 `server.xml` 文件来初始化全局上下文和应用部署信息。然而,在某些情况下,即使在 `server.xml` 中设置了虚拟路径,如果没有同步更新 IDE 或其他运行环境中对应的配置,则可能导致路径映射失效[^4]。 #### 2. **IDE 配置调整** 对于 Eclipse 用户来说,仅修改 `server.xml` 并不足以使虚拟路径生效。还需要进一步调整 Eclipse 对应的服务器配置: - 双击项目的 Server 实例,进入 Modules 标签页。 - 使用 Add External Web Module 功能手动添加外部模块及其对应虚拟路径。 此操作确保了 Eclipse 所管理的应用实例能够识别并适配通过 `server.xml` 设定的路径规则。 #### 3. **Spring MVC 下静态资源配置冲突** 如果项目基于 Spring MVC 构建,并且存在 `/static/**` 类似的静态资源拦截规则,可能会干扰到原本预期的行为模式。例如,尝试访问未被正确定位的静态文件时容易触发 404 错误[^3]。对此类情形可采取以下措施之一予以缓解: - 修改 springmvc-servlet.xml 中有关静态资源请求匹配策略; - 调整 web.xml 内部 Servlet 映射范围至更精确级别而非泛化通配符 (`/*`)。 #### 4. **跨平台差异考量** 值得注意的是不同集成开发环境(IDE)间可能存在细微差别影响最终效果呈现。比如 IntelliJ IDEA 默认构建产物输出位置(out/artifacts/)不同于标准 tomcat/webapps/结构布局,从而造成部分定制选项失灵现象[^5]。针对这种情况建议显式指定目标发布目录或者重新导入全部必要组件以恢复一致性表现。 ```xml <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/images/*</url-pattern> </servlet-mapping> <filter-mapping> <filter-name>someFilterName</filter-name> <url-pattern>/specificPath/*</url-pattern> </filter-mapping> ``` 上述 XML 片段展示了如何精细化控制 URL 请求分派逻辑以便更好地兼容复杂场景下的路由安排。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值