最近工作中,遇到一个新的问题。在前后端分离的项目中,前端项目解压包放在后端项目解压包的根目录下,前端与后端项目路径如下图所示:
在访问项目时候,浏览器应该根据前端的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() {
}
}
此时再次访问项目根路径,就可以实现自动重定向跳转了。