springboot配置过滤器解决html资源路径和接口路径冲突问题

比如:

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接口上

相关推荐
坚定信念,勇往无前3 分钟前
Maven 私有仓库-nexus
java
Minner-Scrapy10 分钟前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
晚风醉蝶19 分钟前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
陈随易33 分钟前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
夏天拐跑了西瓜43 分钟前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
2601_967264281 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习
人间凡尔赛1 小时前
2026 后端架构三驾马车:Wasm 容器上 K8s、存算分离与 AI 原生
后端·云原生·架构
m0_587383002 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林2 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
东风破_2 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript