springcloud集成Oauth2權限項目-自定義參數解析器獲取用戶信息HandlerMethodArgumentResolver(十五)

每個接口在被調用時,很可能需要調用該接口的用戶信息,每次再去數據庫查詢該數據信息,勢必會造成代碼的大量重複,且還容易出錯。 

應用:把該次調用者用戶的信息當做參數傳到對應的方法。

比如:根據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 參數就可以自動獲取用戶信息。

項目地址:https://github.com/James-Pan0525/vcloud.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章