当前位置:网站首页>Resttemplate and feign realize token transmission
Resttemplate and feign realize token transmission
2022-07-06 06:14:00 【Snow peak expensive】
List of articles
Fegin The way
Client and server
One 、 Plus dependence
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Two 、 Definition notes
public @interface CheckLogin {
}
3、 ... and 、 Define facets
import com.itmuch.contentcenter.util.JwtOperator;
import io.jsonwebtoken.Claims;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect // Cut notes
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class CheckLoginAspect {
private final JwtOperator jwtOperator;
//AOP Of Advice(before,after returning,after throwing,around) One of them
@Around("@annotation(com.itmuch.contentcenter.auth.CheckLogin)")// added @CheckLogin All the methods will come here
public Object checkLogin(ProceedingJoinPoint point) throws Throwable {
checkToken();
return point.proceed();
}
private void checkToken() {
try {
// 1. from header Get in there token
HttpServletRequest request = getHttpServletRequest();
String token = request.getHeader("X-Token");
// 2. check token Is it legal & Is it overdue ; If it is illegal or expired, throw the exception directly ; If it is released legally
Boolean isValid = jwtOperator.validateToken(token);
if (!isValid) {
throw new SecurityException("Token illegal !");
}
// 3. If the verification is successful , Then set the user's information to request Of attribute Inside
Claims claims = jwtOperator.getClaimsFromToken(token);
request.setAttribute("id", claims.get("id"));
request.setAttribute("wxNickname", claims.get("wxNickname"));
request.setAttribute("role", claims.get("role"));
} catch (Throwable throwable) {
throw new SecurityException("Token illegal ");
}
}
private HttpServletRequest getHttpServletRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
return attributes.getRequest();
}
}
Four 、 Client creation Fegin Interceptor
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
public class TokenRelayRequestIntecepor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 1. from header Get in there token
HttpServletRequest request = getHttpServletRequest();
String token = request.getHeader("X-Token");
if(!StringUtils.isEmpty(token)){
requestTemplate.header("X-Token",token);
}
}
private HttpServletRequest getHttpServletRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
return attributes.getRequest();
}
}
Four 、 Client plus configuration
feign:
client:
config:
default: # overall situation
loggerLevel: full
requestInterceptors:
- com.itmuch.contentcenter.feignclient.interceptor.TokenRelayRequestIntecepor
5、 ... and 、 test
Incoming client token,token Will pass Fegin Interceptor handle token add .
all Fegin All interfaces will be brought token
RestTemplate The way
1. establish RestTemplate Interceptor
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class RestTemplateRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("X-Token");
HttpHeaders headers = httpRequest.getHeaders();
headers.add("X-Token", token);
// Ensure that the request continues
return clientHttpRequestExecution.execute(httpRequest, body);
}
}
2.RestTemplate example
@Bean
@LoadBalanced
@SentinelRestTemplate(
blockHandler = "handleBlock",
fallback = "handleFallback",
fallbackClass = SentinelBlockHandler.class,
blockHandlerClass = SentinelBlockHandler.class)
public RestTemplate restTemplate(){
// Add the configured interceptor to the instance
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(
Collections.singletonList(new RestTemplateRequestInterceptor())
);
return restTemplate;
}
边栏推荐
- CoordinatorLayout+NestedScrollView+RecyclerView 上拉底部显示不全
- Testing and debugging of multithreaded applications
- 数据库隔离级别
- nodejs实现微博第三方登录
- SQLMAP使用教程(三)实战技巧二
- 请求转发与重定向
- 【微信小程序】搭建开发工具环境
- Summary of anomaly detection methods
- [web security] nodejs prototype chain pollution analysis
- selenium源码通读·9 |DesiredCapabilities类分析
猜你喜欢

E - 食物链
![[course notes] Compilation Principle](/img/cc/34e86087cc5698f9bed91675369265.jpg)
[course notes] Compilation Principle

IDEA 新UI使用

【C语言】字符串左旋
![[ram IP] introduction and experiment of ram IP core](/img/34/1c988456e32a8e9840d1d073caefbf.jpg)
[ram IP] introduction and experiment of ram IP core

LeetCode 1200. 最小绝对差

CoordinatorLayout+NestedScrollView+RecyclerView 上拉底部显示不全

Expose the serial fraudster Liu Qing in the currency circle, and default hundreds of millions of Cheng Laolai

技术分享 | 常见接口协议解析

黑猫带你学eMMC协议第10篇:eMMC读写操作详解(read & write)
随机推荐
[untitled]
Buuctf-[bjdctf2020]zjctf, but so (xiaoyute detailed explanation)
Manhattan distance and Manhattan rectangle - print back font matrix
[API interface tool] Introduction to postman interface
还在为如何编写Web自动化测试用例而烦恼嘛?资深测试工程师手把手教你Selenium 测试用例编写
LeetCode 1200. 最小绝对差
H3C V7 switch configuration IRF
leaflet 地图
【C语言】qsort函数
【Postman】动态变量(也称Mock函数)
Hypothesis testing learning notes
Buuctf-[gxyctf2019] no dolls (xiaoyute detailed explanation)
[postman] test script writing and assertion details
【微信小程序】搭建开发工具环境
Embedded point test of app
What are the test sites for tunnel engineering?
Cannot create PoolableConnectionFactory (Could not create connection to database server. 错误
Gtest之TEST宏的用法
误差的基本知识
公司視頻加速播放