feign+security 并且设置了拦截器
访问连接后 拦截器调用一次 之后要求输入密码 输入之后拦截器又调用一次 不输入拦截器第二次不出现调用
为什么拦截器调用两次? 怎么让拦截器调用一次?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Feign客户端时,结合Spring Security设置拦截器,通常是为了实现API调用的身份验证或其他安全控制。如果遇到拦截器被调用两次的情况,这可能与请求的重定向、认证流程或Feign客户端的配置有关。
认证流程:第一次调用可能是未经身份验证的初始请求,由于未通过认证,服务器返回了需要认证的响应(如401 Unauthorized),导致客户端进行第二次请求,这次请求携带了认证信息(如通过拦截器添加的Token)。如果在输入密码后,拦截器再次被调用,这可能是因为认证成功后,客户端重新尝试了原始请求。
重定向:有时服务器会返回重定向指令(状态码3xx),导致客户端自动发起新的请求到重定向的URL,这也可能导致拦截器被再次调用。
Feign配置:Feign客户端的某些配置可能导致请求被重复发送,比如错误的重试策略(Retryer
)配置。
检查认证逻辑:确保你的认证逻辑正确处理了认证响应,避免不必要的重试。例如,如果使用了OAuth2
,确保在获取到访问令牌后直接使用,而不是再次触发请求。
配置重试策略:检查并调整Feign客户端的重试策略,如果不需要重试,可以禁用重试功能。可以通过设置feign.retryer
为NoneRetryer.INSTANCE
来禁用重试。
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder()
.retryer(NoRetryer.INSTANCE); // 禁用重试
}
处理重定向:如果是因为重定向导致的问题,可以考虑在Feign配置中自定义一个Client
来处理重定向,或者调整重定向策略以适应需求。
日志分析:通过开启Feign的详细日志,可以更清晰地看到每次请求和响应的细节,有助于定位问题所在。
审查安全配置:确认Spring Security的配置是否正确处理了认证成功后的逻辑,避免对已认证的请求进行不必要的二次拦截。
通过上述方法,你可以定位并解决拦截器被多次调用的问题,确保请求流程的高效和安全。