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

Spring 4升级Spring 5后修改密码页面404错误排查求助

Spring 5升级后密码过期跳转改密码页面404排查方案

1. 检查视图解析器配置

确保InternalResourceViewResolver的前缀和后缀配置与JSP路径匹配:

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/jsp/"); // 对应JSP所在父路径
    resolver.setSuffix(".jsp");
    return resolver;
}

控制器返回的逻辑视图名需为public/change-password/change-password,才能正确解析到目标JSP路径,注意路径层级不能多写或少写。

2. 验证控制器请求映射

确认改密码页面的控制器映射与跳转URL完全匹配:

@Controller
@RequestMapping("/public/change-password")
public class ChangePasswordController {

    @GetMapping
    public String showChangePasswordPage() {
        return "public/change-password/change-password";
    }
}
  • 检查跳转目标URL(如/public/change-password)与控制器映射路径一致,无拼写错误。
  • Spring 5默认路径匹配区分大小写,若部署在Linux环境,需确保URL与映射的大小写完全一致。

3. 检查Spring Security拦截规则

密码过期时用户处于未完全认证状态,需放行改密码路径:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/public/change-password/**").permitAll() // 允许匿名访问改密码路径
            .anyRequest().authenticated()
        .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
        .exceptionHandling()
            .authenticationEntryPoint(new CustomAuthenticationEntryPoint()); // 自定义入口点需确保跳转URL正确
}

若密码过期跳转逻辑在AuthenticationSuccessHandler或AuthenticationFailureHandler中实现,需确认跳转URL拼写正确且未被拦截。

4. 排查路径匹配策略变化

Spring 5.3+默认使用PathPatternParser替代AntPathMatcher,部分匹配规则有差异:

  • 若依赖旧匹配器的特殊规则(如**的使用),可手动切换:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setPathMatcher(new AntPathMatcher());
    }
}
  • 确保URL中斜杠处理正确,避免多余或缺失斜杠导致匹配失败。

5. 验证JSP路径与容器配置

  • 确认JSP文件实际路径与/application/src/main/webapp/WEB-INF/jsp/public/change-password/change-password.jsp完全一致,无文件夹或文件名拼写错误。
  • 检查web.xml中DispatcherServlet的url-pattern配置,需使用/而非/*,否则会拦截JSP请求导致容器无法解析:
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:23:06