比如:
html文件使用 /
接口路径使用 /api
首先配置文件里肯定配置范围最大的根路径
server:
port: 80
servlet:
context-path: /
过滤器代码
java
@Slf4j
public class RequestSeparationFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@SneakyThrows
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
String uri=httpRequest.getRequestURI();//请求路径
String apiPath="/api";//接口路径前缀
if(apiPath!=null&&httpRequest.getRequestURI().startsWith(apiPath+(apiPath.endsWith("/")?"":"/"))){
/*
* 接口请求分离
*/
uri=uri.substring(apiPath.length());//删掉请求前缀api,这样接口代码写的时候注解映射不需要加api
request.getRequestDispatcher(uri).forward(request, response);
}else{
/*
* html资源请求分离
*/
//正常文件资源,有后缀名的
if(uri.substring(uri.lastIndexOf("/")).contains(".")){
chain.doFilter(request, response);
}
//没有后缀名的,但是以斜杠结尾,自动补全请求文件路径:index.html
else if(uri.endsWith("/")){
uri+="index.html";
request.getRequestDispatcher(uri).forward(request, response);
}else{//其他的必须重定向到带斜杠的地址,否则前台浏览器自己解析相对路径会出问题(对后台无影响)
httpResponse.sendRedirect(httpRequest.getContextPath() + uri+"/");
}
}
}
@Override
public void destroy() {}
}
使用转发不会重新触发过滤器,而是直接进入controller层
注解映射也不需要加 /api 只需要写/api后面的路径即可 如 @RequestMapping("/login")
这样/login请求就会转发到 /login/index.html
而/api/login请求会转发到/login接口上