You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC报错No mapping for GET /app-name/secure/home排查求助

问题:访问/home端点时提示无映射报错

应用启动无报错、登录页面可正常使用,但用户登录后尝试访问home端点时程序崩溃,收到报错信息:
No mapping for GET /app-name/secure/home

JSP文件存放路径为WEB-INF/jsp/secure/home/view.jsp,以下是相关配置代码:


相关配置代码

Home控制器

@SecureController
@RequestMapping("/home")
public class HomeController {    
    @Autowired    
    public HomeController() {        
        super();    
    }    
    @ModelAttribute("userInformation")    
    public SystemUserDetailsDto getUserDetails() {        
        String username = UserInfoHolder.getUserInfo().getUsername();        
        return username;    
    }    
    @GetMapping    
    public String handle() {        
        return "home/view";    
    }
}

DefaultSecureController实现

@SecureController
@RequestMapping("/*")
public class DefaultSecureController {    
    private String servletContext = "secure/";    
    @RequestMapping    
    public String handle(HttpServletRequest request) {        
        return request.getRequestURI().substring(request.getRequestURI().lastIndexOf(servletContext) + servletContext.length());    
    }
}

secure-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.app.web.mvc">
        <context:include-filter type="annotation" expression="com.app.web.mvc.SecureController" />
    </context:component-scan>
    <mvc:annotation-driven />
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.app.application.core.userinfo.UserInfoInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.app.web.interceptor.SessionTimeoutInterceptor">
                <!-- Preempt the default session timeout by 5 seconds to allow interceptor to work -->
                <property name="sessionMaxInactiveIntervalPreempt" value="5" />
                <property name="timeoutMapping" value="/app/public/login?expired=true" />
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/secure/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <bean id="exceptionHandler" class="com.app.web.mvc.ExceptionHandler">
        <property name="exceptionView" value="displayError" />
    </bean>
</beans>

web.xml中的Servlet配置

<servlet>
    <servlet-name>secure</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/secure-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>secure</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>

问题定位与解决

核心问题

报错的本质是DefaultSecureController的路径映射优先级高于HomeController,导致请求被兜底控制器拦截,而没有匹配到HomeController的/home路径:

  1. secure Servlet的映射是/secure/*,所有/secure/开头的请求都会进入该DispatcherServlet,此时控制器匹配的是/secure/之后的路径部分(即home)。
  2. DefaultSecureController的@RequestMapping("/*")会优先匹配所有单层级路径(包括home),直接覆盖了HomeController的/home映射。

修复步骤

  1. 调整DefaultSecureController的映射优先级
    将其改为兜底映射,仅在没有其他控制器匹配时生效,修改代码如下:

    @SecureController
    public class DefaultSecureController {    
        private String servletContext = "secure/";    
        @RequestMapping(value = "/**", method = {RequestMethod.GET, RequestMethod.POST})
        public String handle(HttpServletRequest request) {        
            String uri = request.getRequestURI();
            int index = uri.lastIndexOf(servletContext);
            if (index != -1) {
                return uri.substring(index + servletContext.length());
            }
            return "error"; // 兜底返回错误视图
        }
    }
    

    /**的匹配优先级低于具体的/home,此时HomeController的映射会被优先匹配。

  2. 验证视图路径正确性
    HomeController返回的"home/view",结合视图解析器的前缀/WEB-INF/jsp/secure/和后缀.jsp,最终路径为/WEB-INF/jsp/secure/home/view.jsp,与你的JSP文件路径完全匹配,这部分无需修改。

  3. 额外检查
    确认登录后UserInfoHolder.getUserInfo()不会返回null,否则HomeController的getUserDetails方法会抛出空指针异常,导致请求处理失败。

内容的提问来源于stack exchange,提问作者dynamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:12:28