springcloud集成Oauth2权限项目-自定义参数解析器获取用户信息HandlerMethodArgumentResolver(十五)

每个接口在被调用时,很可能需要调用该接口的用户信息,每次再去数据库查询该数据信息,势必会造成代码的大量重复,且还容易出错。 

应用:把该次调用者用户的信息当做参数传到对应的方法。

比如:根据token获得到用户信息,将用户信息传到对应请求的method。

实现自定义参数解析器步骤:1、自定义参数解析器  2、注册


新建有个common module

springcloud集成Oauth2权限项目-自定义参数解析器获取用户信息HandlerMethodArgumentResolver(十五)_第1张图片

POM



    4.0.0
    jar
    
        com.study
        vcloud
        1.0-SNAPSHOT
         
    
    com.study.vcloud
    vcloud-common
    0.0.1-SNAPSHOT
    vcloud-common
    公共

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.projectlombok
            lombok
        
        
            io.springfox
            springfox-swagger2
            2.6.1
        

        
            io.springfox
            springfox-swagger-ui
            2.6.1
        

        
        
            io.jsonwebtoken
            jjwt
            0.9.0
        
    


新建用户实体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 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

springcloud集成Oauth2权限项目-自定义参数解析器获取用户信息HandlerMethodArgumentResolver(十五)_第2张图片

然后在接口需要用户信息的时候将参数传入就ok

springcloud集成Oauth2权限项目-自定义参数解析器获取用户信息HandlerMethodArgumentResolver(十五)_第3张图片

接口就会自动将用户的信息传入。比如以后有另外一个微服务,只需要添加common 的依赖,然后在接口入参上加上UserVO userVO 参数就可以自动获取用户信息。

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

你可能感兴趣的:(oauth2)