Zuul学习(三)——自定义参数解析器

一笑奈何 提交于 2020-07-28 13:14:35

1.我们在controller的方法经常要根据token来获取用户的信息,如果每个方法都执行这个操作让程序看起来不太优雅,所以选择使用自定义参数解析器去自动根据token获取用户信息,在controller的方法上加入这个对象作为参数即可。

2.在common模块编写这个自定义参数解析器

@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> clazz = methodParameter.getParameterType();
        return clazz == AuthenticationInfo.class;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);

        String paramToken = request.getParameter("token");
        String cookieToken = getCookieValue(request, "token");
        if (StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
            throw new GlobalException(500, "xxx");
        }
        String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;
        //TODO 根据token获取用户信息
        AuthenticationInfo authenticationInfo = new AuthenticationInfo();
        authenticationInfo.setId(1L);
        authenticationInfo.setName("张三");
        return authenticationInfo;
    }

    private String getCookieValue(HttpServletRequest request, String cookiName) {
        Cookie[]  cookies = request.getCookies();
        if(cookies != null && cookies.length > 0 ){
            for(Cookie cookie : cookies) {
                if(cookie.getName().equals(cookiName)) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }

}
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private UserArgumentResolver userArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userArgumentResolver);
    }
}

3.在user-service引入common模块之后,这样操作就可以拿到当前用户的信息

@RestController
public class ApiTestConroller {

    @GetMapping("/api/say")
    public String sayHi(AuthenticationInfo authenticationInfo) {
        return authenticationInfo.toString();
    }

}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!