@FeignClient中configuration属性的简单介绍
第一个控制请求的日志打印级别
先看效果图
日志级别配置方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 新增类 public class FeignConfig { /** * NONE【性能最佳,适用于生产】:不记录任何日志(默认值) * BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间 * HEADERS:记录BASIC级别的基础上,记录请求和响应的header。 * FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数 据 * @return */ @Bean public Logger.Level feignLogLevel(){ return Logger.Level.FULL; } } |
如何配置
接口认证效果图
服务方获取到的信息
消费方发送的信息
在这个过程中,对于请求的接口进行了认证
如果token不对,效果图如下
本次的认证功能需要三个部分,新增认证服务器,服务方加入认证,消费方获取认证token
认证服务器代码
pom文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | <?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion> <groupId>jwt.oauth</groupId> <artifactId>jwt-oauth-service</artifactId> <version> 1.0 -SNAPSHOT</version> <!--spring boot 父启动器依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> 2.3 . 12 .RELEASE</version> </parent> <properties> <eureka.version> 2.1 </eureka.version> <web.version> 2.1 . 18 .RELEASE</web.version> </properties> <!--用于整体控制依赖的版本--> <dependencyManagement> <dependencies> <!--spring cloud依赖管理,引入了Spring Cloud的版本--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope> import </scope> </dependency> <!--web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version> 2.0 . 1 .RELEASE</version> </dependency> <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version> 1.18 . 16 </version> </dependency> <!--引入security对oauth2的支持--> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version> 2.3 . 4 .RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version> 2.1 . 11 .RELEASE</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--移除tomcat容器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!--加入undertow--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <!--导入spring cloud oauth2依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> <exclusions> <exclusion> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> </dependency> <!--引入security对oauth2的支持--> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </dependency> </dependencies> </project> |
配置文件
1 2 3 4 5 6 7 8 9 10 11 | server.port= 2002 spring.application.name=jwt-oauth #注册到eureka注册中心,如果是注册到集群就用逗号连接多个,单实例写上一个就好 #eureka.client.service-url.defaultZone=http: //localhost:8761/eureka logging.level.jwt.oauth=debug logging.level.web=debug spring.devtools.add-properties= false |
java代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | package jwt.oauth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Description: * @Author: tutu-qiuxie * @Create: 2024/4/12 10:19 */ @SpringBootApplication public class JwtOauthApplication { public static void main(String[] args) { SpringApplication.run(JwtOauthApplication. class ,args); } } package jwt.oauth.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.jwt.crypto.sign.MacSigner; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.security.oauth2.provider.token.DefaultTokenServices; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; /** * @Description: * @Author: tutu-qiuxie * @Create: 2024/4/12 10:20 */ @Configuration @EnableAuthorizationServer //开启认证服务器功能 public class OauthServerConfiger extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { super .configure(security); security.allowFormAuthenticationForClients() .tokenKeyAccess( "permitAll()" ) .checkTokenAccess( "permitAll()" ); } /** * 客户端详情配置 * @param clients * @throws Exception */ @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { super .configure(clients); clients.inMemory() .withClient( "client_qiuxie" ) .secret( "13301455191qiuxieM" ) .resourceIds( "loginId" ) .authorizedGrantTypes( "password" , "refresh_token" ) .scopes( "all" ); } /** * 配置token令牌相关 * @param endpoints * @throws Exception */ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { super .configure(endpoints); endpoints.tokenStore(tokenStore()) .tokenServices(authorizationServerTokenServices()) .authenticationManager(authenticationManager) .allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.GET); } /** * 描述token信息 * @return */ public AuthorizationServerTokenServices authorizationServerTokenServices(){ DefaultTokenServices tokenServices = new DefaultTokenServices(); tokenServices.setSupportRefreshToken( true ); tokenServices.setTokenStore(tokenStore()); /** * 添加jwt令牌 */ tokenServices.setTokenEnhancer(jwtAccessTokenConverter()); tokenServices.setAccessTokenValiditySeconds( 120 ); //令牌有效时间30s tokenServices.setRefreshTokenValiditySeconds( 259200 ); //刷新令牌有效时间3天 return tokenServices; } public TokenStore tokenStore(){ return new JwtTokenStore(jwtAccessTokenConverter()); } private String sign_key= "qiuxie1992" ; /** * 返回jwt令牌装换器(生成jwt令牌) * @return */ public JwtAccessTokenConverter jwtAccessTokenConverter(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); /** * 签名秘钥 */ converter.setSigningKey(sign_key); /** * 验证使用的秘钥 */ converter.setVerifier( new MacSigner(sign_key)); return converter; } } package jwt.oauth.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import java.util.ArrayList; /** * @Description: * @Author: tutu-qiuxie * @Create: 2024/4/12 10:21 */ @Configuration public class SecurityConfiger extends WebSecurityConfigurerAdapter { @Autowired private PasswordEncoder passwordEncoder; /** * 注册认证管理器到容器 * @return * @throws Exception */ @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super .authenticationManagerBean(); } /** * 密码编码器 * @return */ @Bean public PasswordEncoder passwordEncoder(){ return NoOpPasswordEncoder.getInstance(); } /** * 处理用户名和密码 * @param auth * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { UserDetails userDetails= new User( "admin" , "13301455191qiuxieM" , new ArrayList<>()); auth.inMemoryAuthentication() .withUser(userDetails).passwordEncoder(passwordEncoder); } } |
服务方需要新增信息
1 2 3 4 5 6 7 8 9 10 11 12 | <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version> 2.5 . 2 </version> </dependency> <!--引入security对oauth2的支持--> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version> 2.5 . 0 .RELEASE</version> </dependency> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | package com.ip.config; import org.springframework.beans.factory.annotation.Value; 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.http.SessionCreationPolicy; import org.springframework.security.jwt.crypto.sign.MacSigner; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; /** * @Description: * @Author: tutu-qiuxie * @Create: 2024/4/12 10:24 */ @Configuration @EnableResourceServer @EnableWebSecurity public class ResourceServerConfiger extends ResourceServerConfigurerAdapter { @Value ( "${resourceId}" ) private String resourceId; @Value ( "${signKey}" ) private String signKey; /** * 进行token校验 * @param resources * @throws Exception */ @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { //jwt令牌 resources.resourceId(resourceId).tokenStore(tokenStore()).stateless( true ); //无状态设置 } public TokenStore tokenStore(){ return new JwtTokenStore(jwtAccessTokenConverter()); } /** * 返回jwt令牌转换器 * @return */ public JwtAccessTokenConverter jwtAccessTokenConverter(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); /** * 签名秘钥 */ converter.setSigningKey(signKey); converter.setVerifier( new MacSigner(signKey)); return converter; } /** * 针对api接口进行认证或是不认证 * @param http * @throws Exception */ @Override public void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .and() .authorizeRequests() .antMatchers( "/queryIp/**" ).authenticated() //这里面的请求都是需要认证的 .anyRequest().permitAll(); //其他的请求不认证 } } |
配置文件信息
消费方对应代码
如果你已经使用了
1 2 3 4 | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> |
可以按照下面的配置
下面给出具体代码,请注意本次代码需要了解一定的微服务知识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | package com.java.config; import com.alibaba.fastjson.JSONObject; import com.java.log.MyFeignLogger; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; /** * @Description: * @Author: Yourheart * @Create: 2022/9/16 13:30 */ //@Configuration public class FeignConfig { // @Autowired // private RestTemplate restTemplate; /** * NONE【性能最佳,适用于生产】:不记录任何日志(默认值) * BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间 * HEADERS:记录BASIC级别的基础上,记录请求和响应的header。 * FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数 据 * @return */ @Bean public Logger.Level feignLogLevel(){ return Logger.Level.FULL; } @Bean public RequestInterceptor requestInterceptor() { return new RequestInterceptor() { @Override public void apply(RequestTemplate template) { // 假设你已经有方法获取到了正确的Token String accessToken = getToken(); template.header( "Authorization" , "Bearer " + accessToken); } }; } private String getToken(){ String url = "http://localhost:2002/oauth/token" ; String clientSecret = "13301455191qiuxieM" ; String grantType = "password" ; String username = "admin" ; String password = "13301455191qiuxieM" ; String clientId = "client_qiuxie" ; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); map.add( "client_secret" , clientSecret); map.add( "grant_type" , grantType); map.add( "username" , username); map.add( "password" , password); map.add( "client_id" , clientId); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response = restTemplate.postForEntity(url, request, String. class ); // 提取返回值中的access_token String responseBody = response.getBody(); JSONObject jsonObject = JSONObject.parseObject(responseBody); String accessToken = jsonObject.getString( "access_token" ); return accessToken; } } |
关于@FeignClient中configuration属性两种方面的介绍就到这里了
标签:
feign
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异