当前位置:网站首页>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;
}
边栏推荐
- Function of contenttype
- Seven imperceptible truths in software testing
- How to recover Huawei router's forgotten password
- [C language] string left rotation
- Reading notes of effective managers
- Arrays and collections
- LeetCode 1200. 最小绝对差
- Summary of anomaly detection methods
- ICLR 2022 spotlight | analog transformer: time series anomaly detection method based on correlation difference
- win10无法操作(删除、剪切)文件
猜你喜欢
[postman] test script writing and assertion details
How to use the container reflection method encapsulated by thinkphp5.1 in business code
PAT(乙级)2022年夏季考试
Investment strategy discussion and market scale prediction report of China's solid state high power amplifier industry from 2022 to 2028
Fault, error, failure of functional safety
Understanding of processes and threads
进程和线程的理解
D - How Many Answers Are Wrong
Digital triangle model acwing 1015 Picking flowers
曼哈顿距离与曼哈顿矩形-打印回字型矩阵
随机推荐
异常检测方法总结
【Postman】动态变量(也称Mock函数)
10m25dcf484c8g (FPGA) amy-6m-0002 BGA GPS module
Title 1093: character reverse order
使用Nacos管理配置
Application of Lie group in gtsam
Detailed explanation of P problem, NP problem, NPC problem and NP hard problem
H3C V7 switch configuration IRF
Accélération de la lecture vidéo de l'entreprise
全链路压测:构建三大模型
Linux regularly backs up MySQL database
进程和线程的理解
E - 食物链
【C语言】字符串左旋
LeetCode 1200. 最小绝对差
功能安全之故障(fault),错误(error),失效(failure)
Digital triangle model acwing 1015 Picking flowers
职场进阶指南:大厂人必看书籍推荐
Commodity price visualization
调用链监控Zipkin、sleuth搭建与整合