Spring Security项目入口URL添加项目名后返回404是什么原因?
问题原因
- 未配置项目全局上下文路径:Spring Boot项目默认的请求根路径为
/,你没有配置/pojoname作为全局前缀的话,服务端没有对应/pojoname/login的路由映射,访问时自然返回404。 - Spring Security配置未适配路径前缀:如果你已经配置了全局上下文路径,但登录页配置、路径放行规则没有适配前缀规则,也会出现路径不匹配的问题。
解决方法
根据你的需求选择以下两种方案即可:
方案一:配置全局上下文路径(适合整个项目所有接口都需要带/pojoname前缀的场景)
- 在项目配置文件中添加上下文路径配置:
- 如果你用
application.properties,添加:server.servlet.context-path=/pojoname - 如果你用
application.yml,添加:server: servlet: context-path: /pojoname
- 如果你用
- 该配置生效后,Spring Boot会自动为所有接口、视图路径拼接
/pojoname前缀,你现有Spring Security配置无需修改,直接访问http://localhost:8099/pojoname/login即可正常访问。注意:如果你的登录页表单提交action硬编码写死了
/login,需要改为相对路径login,如果使用Thymeleaf模板则改为@{/login},让框架自动拼接上下文路径。
方案二:仅修改登录相关路径(适合只有登录路径需要带/pojoname前缀,其他接口不需要的场景)
不需要修改全局配置,直接调整Spring Security的路径规则即可:
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // 放行带前缀的登录路径 .antMatchers("/pojoname/login").permitAll() .antMatchers("/register", "/registration", "/editProfile").permitAll() .anyRequest().authenticated() .and() .formLogin() // 登录页路径修改为带前缀的路径 .loginPage("/pojoname/login").permitAll() .usernameParameter("email") .and() .logout() .permitAll(); }
修改完成后,同步将登录页对应的Controller路由调整为/pojoname/login即可。
内容的提问来源于stack exchange,提问作者Faheem azaz Bhanej
相关产品推荐
相关产品推荐

