每個接口在被調用時,很可能需要調用該接口的用戶信息,每次再去數據庫查詢該數據信息,勢必會造成代碼的大量重複,且還容易出錯。
應用:把該次調用者用戶的信息當做參數傳到對應的方法。
比如:根據token獲得到用戶信息,將用戶信息傳到對應請求的method。
實現自定義參數解析器步驟:1、自定義參數解析器 2、註冊
新建有個common module
POM
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<parent>
<groupId>com.study</groupId>
<artifactId>vcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study.vcloud</groupId>
<artifactId>vcloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>vcloud-common</name>
<description>公共</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<!--JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies>
</project>
新建用戶實體UserVO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVO implements Serializable {
/**
* 主鍵ID
*/
private Integer userId;
}
解析器TokenArgumentResolver.java 實現HandlerMethodArgumentResolver接口
@Configuration
public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 返回true纔會執行resolveArgument方法
**/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(UserVO.class);
}
/**
* @Author Pan Weilong
* @Description 解析token,獲取用戶信息
* @Date 13:39 2019/10/29
* @Param [parameter, mavContainer, nativeWebRequest, binderFactory]
* @return java.lang.Object
**/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory binderFactory) throws Exception {
UserVO userVO = new UserVO();
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
Integer userId=UserUtils.getUserId(request);
userVO.setUserId(userId);
return userVO;
}
}
然後註冊
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new TokenArgumentResolver());
}
}
utils
public class UserUtils {
/**
* 獲取用戶id
**/
public static Integer getUserId(HttpServletRequest request) {
String token=getToken(request);
String key = Base64.getEncoder().encodeToString("vcloud".getBytes());
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return Integer.parseInt(claims.get("userId").toString());
}
/**
* 獲取token
**/
public static String getToken(HttpServletRequest request) {
String token = request.getHeader("Authorization");
return StringUtils.substringAfter(token, "bearer ");
}
}
common jar完成了。
在user服務中依賴common jar
然後在接口需要用戶信息的時候將參數傳入就ok
接口就會自動將用戶的信息傳入。比如以後有另外一個微服務,只需要添加common 的依賴,然後在接口入參上加上UserVO userVO 參數就可以自動獲取用戶信息。