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

  • Post author:
  • Post category:其他


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

在访问项目时候,浏览器应该根据前端的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() {

	}
}

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



版权声明:本文为funnychaos原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。