在线书店项目GET请求403,控制器未调用问题求助
解决GET请求返回403且未触发控制器的问题
核心原因分析
403 Forbidden错误且请求未到达控制器,90%以上是安全拦截导致——你的请求被Spring Security或自定义过滤器提前拦截,没有进入控制器处理流程。
解决方案步骤
1. 调整安全框架配置(重点)
如果项目使用Spring Security,默认会拦截所有HTTP请求并要求认证,需明确放行/api/v1/books/search端点:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth // 放行书籍搜索接口 .requestMatchers(HttpMethod.GET, "/api/v1/books/search").permitAll() // 其他接口按需配置权限规则 .anyRequest().authenticated() ) // 纯后端API场景可关闭CSRF防护 .csrf(csrf -> csrf.disable()); return http.build(); } }
如果是自定义过滤器拦截了请求,检查过滤器逻辑,调整拦截规则,避免误拦截该GET请求。
2. 修复仓库SQL语法问题(提前规避后续错误)
当前原生SQL的LIKE写法存在语法错误,解决权限问题后会触发SQL异常,需用CONCAT拼接通配符:
@Repository public interface BooksRepository extends JpaRepository<Books,Long> { Optional<Books> findById(Long id); @Query(value = "SELECT b FROM books b WHERE b.title LIKE CONCAT('%', :query, '%')",nativeQuery = true) List<Books> searchBookByTitle(String query); @Query(value = "SELECT b FROM books b WHERE b.genre LIKE CONCAT('%', :query, '%')",nativeQuery = true) List<Books> searchBookByGenre(String query); @Query(value = "SELECT b FROM books b inner join books_and_authors bas on b.id = bas.book_id " + "inner join authors a on bas.author_id = a.id WHERE a.name LIKE CONCAT('%', :query, '%')",nativeQuery = true) List<Books> searchByAuthor(String query); }
3. 验证请求合法性
确认Postman中的请求地址完全匹配:http://localhost:8080/api/v1/books/search?query=Tolstoy,检查是否存在拼写错误、大小写不一致等问题。
内容的提问来源于stack exchange,提问作者Kai7
相关产品推荐
相关产品推荐

