springboot中如何指定某些接口不被拦截
作者:程序修理员
1、监听器(Interceptor)拦截处理
在 Spring Boot应用中,如果你希望某些请求地址不被监听器(Interceptor)拦截处理,可以通过配置拦截器的路径来实现。拦截器通常用于在请求前后进行处理,比如权限验证、日志记录等,但有时候你可能希望某些请求可以跳过这些处理。
以下是实现这一目标的一般步骤:
1)定义拦截器:
@Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在此处编写你的拦截逻辑 // 返回 true 表示继续处理请求,返回 false 表示结束请求 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后进行处理 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在请求完成之后进行处理 } }
2)配置拦截器:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns("/public/**"); // 跳过 /public 下的路径 } }
addPathPatterns("/**") 表示拦截所有路径,而 excludePathPatterns("/public/**")
表示跳过以 /public/ 开头的路径,即不对这些路径应用拦截器逻辑。
2、绕过Spring Security 认证处理
在 Spring Security 中,AuthenticationEntryPoint 主要用于处理未经认证的请求,例如需要登录但用户未提供凭证时的处理逻辑。如果你希望某些接口请求不经过 AuthenticationEntryPoint 的认证处理,通常可以通过配置 Spring Security 的 HttpSecurity 来实现。
1)配置类中定义 HTTP Security:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() // 允许访问的接口路径 .anyRequest().authenticated() // 其他接口路径需要认证 .and() .httpBasic() .authenticationEntryPoint(new MyAuthenticationEntryPoint()); // 设置自定义的认证入口点 } }
说明:
antMatchers("/public/**").permitAll() 指定了 /public/** 路径下的接口不需要认证,可以直接访问。
.anyRequest().authenticated() 告诉 Spring Security 其他所有请求都需要认证。
.httpBasic().authenticationEntryPoint(new MyAuthenticationEntryPoint()) 指定了自定义的 AuthenticationEntryPoint,你可以根据需要进行自定义逻辑,例如返回特定的错误信息或跳转页面。
2)自定义 AuthenticationEntryPoint:
/** * 认证失败处理类 返回未授权 * * @author dongxiajun */ @Component public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { private static final long serialVersionUID = -8970718410437077606L; @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(401, msg))); } }
到此这篇关于springboot中如何指定某些接口不被拦截的文章就介绍到这了,更多相关springboot指定接口不被拦截内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!