首页 > 其他分享 >SpringBoot2 静态文件路径与接口路径冲突(相同)解决方案

SpringBoot2 静态文件路径与接口路径冲突(相同)解决方案

时间:2022-12-13 17:11:55浏览次数:48  
标签:路径 request springframework handler SpringBoot2 接口 org import DispatcherServlet

事情是这样的, 最近接手个项目 给它底层从ssm整到springboot2 + mp
由于之前很多xxx.do请求 而我又不想用后缀,
所以就得匹配全部后缀或者无后缀(方法有很多方案自行百度), 然后就狗血的出现了一个问题

 

起因是controller接口的mapping与静态文件路径一样 如下图

 

 

 

 

由于我开了匹配任意后缀功能,
这样当你访问这个html的时候就会被认为是正常的get请求被转发到controller去处理,
说明springboot是先判断是不是请求然后再判断是不是静态文件
我们得给它改改顺序

 

我们都知道springmvc的默认servlet是DispatcherServlet

那就去瞅瞅DispatcherServlet是怎么处理的

 

 继续跟踪

 

 说明实在这一行确定请求的类型的 发现它调用了getHandler方法 继续跟

 

阅读getHandler方法发现它是获取所有handler直接遍历 发现能处理就直接return了
那这样说明在这个this.handlerMappings遍历的时候肯定先找到的是controller层的handler
我们先通过debug看看handlerMappings里有哪些handler

 

debug发现索引1的位置是controller层的handler
而html文件的handler在最后面 叫做SimpleUrlHandlerMapping
我们需要让它这个请求返货SimpleUrlHandlerMapping 而不是RequestMappingHandlerMapping

 

那我们自定义 MyDispatcherServlet 继承 DispatcherServlet 改改它的 getHandler里的逻辑就行了

这是重写的 MyDispatcherServlet

import org.springframework.core.annotation.Order;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 *  自定义 DispatcherServlet 以支持静态文件路径和api请求路径冲突时先支持静态文件路径
 * @author xudaz
 * @date 2021/6/11
 * @see MyMvcConfig#servletRegistrationBean(com.qjr.amp.common.config.MyDispatcherServlet)
 */
@Component("DispatcherServlet")
@Order
public class MyDispatcherServlet extends DispatcherServlet {

    private static final List<String> STATIC_PATH= Arrays.asList(".html", ".css", ".js", ".jpg", ".png");

    /**
     * Return the HandlerExecutionChain for this request.
     * <p>Tries all handler mappings in order.
     *
     * @param request current HTTP request
     * @return the HandlerExecutionChain, or {@code null} if no handler could be found
     */
    @SuppressWarnings("NullableProblems")
    @Override
    @Nullable
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

        for (String path : STATIC_PATH) {
            // 匹配上 直接调用 SimpleUrlHandler 跳去静态资源
            if (request.getServletPath().endsWith(path) ) {
                List<HandlerMapping> handlerMappings = this.getHandlerMappings();
                assert handlerMappings != null;
                for (HandlerMapping handlerMapping : handlerMappings) {
                    if ( handlerMapping.getClass() == SimpleUrlHandlerMapping.class ) {
                        return handlerMapping.getHandler(request);
                    }
                }
            }
        }

        return super.getHandler(request);
    }
}
然后还要给springBoot 注册一下 在启动类或者配置类里注册
    /**
     * 设置匹配*.* 后缀请求
     */
    @Bean
    public ServletRegistrationBean<DispatcherServlet> servletRegistrationBean(MyDispatcherServlet dispatcherServlet) {
        ServletRegistrationBean<DispatcherServlet> servletServletRegistrationBean = new ServletRegistrationBean<>(dispatcherServlet);
        servletServletRegistrationBean.addUrlMappings("/");
        return servletServletRegistrationBean;
    }

! 注意 我这里形参的参数类型写的是我自己写的MyDispatcherServlet 这样就能注册上了

效果

能访问了

 

标签:路径,request,springframework,handler,SpringBoot2,接口,org,import,DispatcherServlet
From: https://www.cnblogs.com/lasding/p/16979317.html

相关文章

  • C# 调用https接口 安全证书问题 解决方法
    原文链接: https://blog.csdn.net/lizaijinsheng/article/details/127321758说明: 如果是用https的话,由于没有证书,会报错:基础连接已经关闭:未能为 SSL/TLS安全通道建立......
  • 【校招VIP】[约起来] 接口设计1:图片上传接口
    今天来看商业实战项目约起来的第一个模块,活动发布模块的接口设计,这期课程包括两个接口,一个是图片上传,一个是活动发布后的提交。首先了解图片上传接口,常规的图片上传需要前......
  • Unity - 粒子系统跟随路径移动
    对于最新版的粒子系统ParticleSystem,要让其跟随路径移动,无非就是借用其自身的API直接为每个粒子设置速度。看一下最终的效果图:编辑器为了能在场景中更方便的编辑路径,我们要......
  • 便历某路径下文件夹,把所有MP3数据读到数据库
    <!--#includefile="Sql_Conn.asp"--><!--#includefile="Inc/Inc.asp"--><!--#includefile="Inc/Config.asp"--><%'本版本为OK版1.0addbyymon2008.11.17functionGe......
  • 剑指offer110:所有路径
    题目:给定一个有n个节点的有向无环图,用二维数组graph表示,请找到所有从0到n-1的路径并输出(不要求按顺序)。graph的第i个数组中的单元都表示有向图中i号节点所能......
  • 剑指offer100:三角形中最小路径之和
    题目:给定一个三角形triangle,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层......
  • 剑指offer99:最小路径之和
    题目:给定一个包含非负整数的mxn网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例一:输......
  • HTML 文件路径
      HTML文件路径文件路径描述了网站文件夹结构中某个文件的位置。文件路径会在链接外部文件时被用到:网页图像样式表JavaScript绝对文件路径绝对文件路径是......
  • 接口自动化框架(Python)之 三,base.py的配置
     主要以读取excel表的信息: #-*-coding:utf-8-*-#@Time:2019-10-23#@Author:carl_djimportjsonimportrequestsfromopenpyxl.stylesimportcolorsfromInte......
  • 接口自动化框架(Python)之 一,如何规划自动化框架
    由于测试人员不足,同时也为了减少测试量,这两天写了一个接口自动化框架,主要由python3+unittest+ddt来编写主要完成的功能:1、对webdriver进行了第二次的简单封装,使用更加方便2......