Tomcat访问项目出现HTTP状态404-未找到,类型 状态报告 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。apache-tomcat-9.0.39

解决方法:

IDEA,上方菜单栏点击Run–>Edit Configurations…,选择Deployment,将Application context里面的内容删除,置空即可。

 

成功演示:

<think>好的,我现在需要帮助用户解决在Spring Boot项目中遇到的Shiro配置问题以及404错误。用户提到两个主要问题:Realm bean未找到HTTP 404错误。我需要结合之前的对话和用户提供的引用内容来提供解决方案。 首先,回顾之前的回答,我已经给出了创建自定义Realm Bean和添加shiro.ini两种方法。现在用户再次遇到类似问题,可能需要更详细的步骤或排查方法。此外,用户还遇到了HTTP 404错误,这可能与Shiro的配置或Spring Boot的路由设置有关。 接下来,我需要考虑用户可能的错误点。Realm bean未找到通常是因为Shiro配置类没有被正确扫描或依赖冲突。HTTP 404错误可能由Shiro过滤器配置不当、控制器未正确注册或静态资源被拦截引起。 根据用户提供的引用[1],虽然内容是关于日志框架的,但可以提醒用户检查日志输出以定位问题。例如,启动时的Bean创建异常或URL映射问题可能记录在日志中。 我需要分步骤解决这两个问题: 1. **解决Realm Bean未找到的问题**: - 确保自定义Realm类正确继承AuthorizingRealm,并且被@Bean注解正确注册。 - 检查配置类是否被@ComponentScan扫描到。 - 验证依赖是否正确,排除冲突的starter依赖,使用shiro-spring和shiro-web的组合。 2. **解决HTTP 404错误**: - 检查Shiro过滤器链的配置,确保不会拦截所有请求而未被正确处理。 - 确认控制器类是否有@RestController或@Controller注解,并且请求路径正确。 - 查看静态资源路径是否被Shiro拦截,需要排除静态资源目录。 - 检查Spring Boot的主启动类位置,确保能够扫描到控制器和配置类。 此外,需要提醒用户查看启动日志,确认是否有Bean创建失败或URL映射的信息。可能的依赖冲突也需要检查,特别是Shiro和Spring Boot版本是否兼容。如果用户使用的是Spring Boot 3.x,可能需要升级到Shiro 2.x版本。 最后,整理这些思路,形成结构化的解决方案,包括代码示例、配置步骤和排查要点,确保用户能够逐步跟随操作解决问题。</think>--- ### 综合解决方案:Shiro Realm Bean缺失与HTTP 404错误排查 #### 一、核心问题定位 1. **`No bean of type &#39;Realm&#39;`** - Shiro配置未正确注册Realm到Spring容器 - 依赖冲突导致自动配置失效 2. **HTTP 404错误** - Shiro过滤器拦截规则配置错误 - 控制器未被Spring扫描或路径映射错误 - 静态资源未正确放行 --- ### 二、分步解决方案 #### 步骤1:修复Realm Bean缺失问题 **1.1 创建自定义Realm(必须实现核心方法)** ```java // 继承AuthorizingRealm并添加@Component @Component public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; // 注入Spring管理的服务 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); String username = (String) principals.getPrimaryPrincipal(); info.setRoles(userService.getUserRoles(username)); return info; // 返回授权信息[^1] } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { UsernamePasswordToken upToken = (UsernamePasswordToken) token; User user = userService.findByUsername(upToken.getUsername()); if (user == null) return null; return new SimpleAuthenticationInfo( user.getUsername(), user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName() ); } } ``` **1.2 配置类修正(关键点)** ```java @Configuration public class ShiroConfig { // 必须通过参数注入Realm @Bean public SecurityManager securityManager(UserRealm userRealm) { // 注意参数类型 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean(); filter.setSecurityManager(securityManager); // 配置拦截规则(解决404的关键) Map<String, String> filterMap = new LinkedHashMap<>(); filterMap.put("/static/**", "anon"); // 放行静态资源 filterMap.put("/login", "anon"); filterMap.put("/**", "authc"); // 需要认证 filter.setFilterChainDefinitionMap(filterMap); filter.setLoginUrl("/login"); // 与控制器路径匹配 return filter; } } ``` #### 步骤2:解决HTTP 404错误 **2.1 检查控制器映射** ```java @RestController public class LoginController { @GetMapping("/login") // 必须与Shiro的loginUrl一致 public ResponseEntity<?> loginPage() { return ResponseEntity.ok("Login page"); } @PostMapping("/api/login") public ResponseEntity<?> doLogin(@RequestBody LoginForm form) { // 认证逻辑 } } ``` **2.2 静态资源配置(Spring Boot 2.x)** ```properties # application.properties spring.mvc.static-path-pattern=/static/** spring.web.resources.static-locations=classpath:/static/ ``` **2.3 验证组件扫描范围** ```java @SpringBootApplication @MapperScan("com.example.dao") @ComponentScan(basePackages = { "com.example.config", "com.example.controller", "com.example.service" }) // 确保覆盖所有组件 public class CinemaManagerApiApplication { public static void main(String[] args) { SpringApplication.run(CinemaManagerApiApplication.class, args); } } ``` #### 步骤3:依赖管理(关键) ```xml <!-- 正确依赖组合 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.13.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.13.0</version> </dependency> <!-- 排除冲突starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 三、深度排查指南 | 现象 | 可能原因 | 解决方案 | |---------------------|-------------------------|------------------------------------------------------------------------| | 启动时报`No bean Realm` | 1. Realm类未加@Component注解<br>2. 配置类未正确注入Realm类型 | 检查Realm实现类是否在组件扫描范围内,配置类参数类型是否具体到实现类 | | 登录后跳转404 | 1. 控制器路径与Shiro配置不匹配<br>2. 未正确返回视图或JSON数据 | 使用Postman测试接口,检查是否所有请求都需要认证(可能误拦截) | | 静态资源加载失败 | 1. Shiro拦截了静态路径<br>2. 资源位置不符合Spring Boot默认配置 | 在ShiroFilter中明确放行`/static/**`路径,检查`spring.web.resources.static-locations` | --- ### 四、调试技巧 1. **查看启动日志** 在控制台搜索`Mapped URL path`确认控制器路径注册情况 2. **启用Shiro调试模式** ```properties # application.properties logging.level.org.apache.shiro=DEBUG ``` 3. **验证Bean存在性** 在启动类中添加测试代码: ```java @SpringBootApplication public class CinemaManagerApiApplication implements CommandLineRunner { @Autowired private ApplicationContext context; public static void main(String[] args) { SpringApplication.run(CinemaManagerApiApplication.class, args); } @Override public void run(String... args) { System.out.println("Realm Bean存在性: " + context.containsBean("userRealm")); } } ``` --- ### 五、进阶优化建议 1. **多Realm配置** 使用`ModularRealmAuthenticator`实现多认证源 ```java @Bean public SecurityManager securityManager(UserRealm userRealm, JwtRealm jwtRealm) { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setAuthenticator(new ModularRealmAuthenticator()); manager.setRealms(Arrays.asList(userRealm, jwtRealm)); return manager; } ``` 2. **统一异常处理** 捕获Shiro异常返回标准JSON响应: ```java @ControllerAdvice public class ShiroExceptionHandler { @ExceptionHandler(AuthorizationException.class) public ResponseEntity<?> handleAuthError(AuthorizationException e) { return ResponseEntity.status(403).body(Map.of("code", 403, "msg", "权限不足")); } } ``` --- ### 六、典型错误场景复原 **场景1:错误使用`@Bean`返回类型** 错误配置: ```java @Bean public Realm realm() { // 返回类型应为具体实现类 return new UserRealm(); } @Bean public SecurityManager securityManager(Realm realm) { // 这里实际注入的是AuthorizingRealm代理对象 //... } ``` 修正方案: ```java @Bean public UserRealm userRealm() { // 明确返回具体类型 return new UserRealm(); } @Bean public SecurityManager securityManager(UserRealm userRealm) { //... } ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

作家不写作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值