目录
1.前置要求和授权登录原理
2.读取自定义json配置文件信息
3.获取跳转url和回调的接口
4.使用websocket和前端建立连接
5.对接qq登录的流程
在前面说了qq登录的前置条件和基础流程
本章使用的自定义json的解析对于配置信息的读取
不同于平常的yaml文件配置,使用自定义的注解对于bean的重新写入
需要解析的json文件
{
"baseConf": {
"clientId": "你自己的",
"redirectUri": "你自己的"
},
"baseUrl": {
"webRequestUrl": "https://graph.qq.com/oauth2.0/authorize",
"callbackAddress": "http://chenyp.top/second_hand/qq/qqLogin",
"getTokenUrl": "https://graph.qq.com/oauth2.0/token",
"getOpenidUrl": "https://graph.qq.com/oauth2.0/me",
"getInfoUrl": "https://graph.qq.com/oauth2.0/get_user_info",
"refreshTokenUrl": "https://graph.qq.com/oauth2.0/token"
}
}
定义一个注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface MyConfigurationJson {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
}
定义映射类
配置类
package top.chenyp.qqService.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import top.chenyp.qqService.annotation.MyConfigurationJson;
@Component
@MyConfigurationJson(prefix = "baseConf")
public class QQBaseConfig {
private String clientId;
private String redirectUri;
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getRedirectUri() {
return redirectUri;
}
public void setRedirectUri(String redirectUri) {
this.redirectUri = redirectUri;
}
@Override
public String toString() {
return "QQBaseConfig{" +
"clientId='" + clientId + '\'' +
", redirectUri='" + redirectUri + '\'' +
'}';
}
}
url类
@Component
@MyConfigurationJson(prefix = "baseUrl")
public class QQBaseUrl {
private String webRequestUrl;
private String callbackAddress;
private String getTokenUrl;
private String getOpenidUrl;
private String getInfoUrl;
private String refreshTokenUrl;
public String getWebRequestUrl() {
return webRequestUrl;
}
public void setWebRequestUrl(String webRequestUrl) {
this.webRequestUrl = webRequestUrl;
}
public String getCallbackAddress() {
return callbackAddress;
}
public void setCallbackAddress(String callbackAddress) {
this.callbackAddress = callbackAddress;
}
public String getGetTokenUrl() {
return getTokenUrl;
}
public void setGetTokenUrl(String getTokenUrl) {
this.getTokenUrl = getTokenUrl;
}
public String getGetOpenidUrl() {
return getOpenidUrl;
}
public void setGetOpenidUrl(String getOpenidUrl) {
this.getOpenidUrl = getOpenidUrl;
}
public String getGetInfoUrl() {
return getInfoUrl;
}
public void setGetInfoUrl(String getInfoUrl) {
this.getInfoUrl = getInfoUrl;
}
public String getRefreshTokenUrl() {
return refreshTokenUrl;
}
public void setRefreshTokenUrl(String refreshTokenUrl) {
this.refreshTokenUrl = refreshTokenUrl;
}
@Override
public String toString() {
return "QQBaseUrl{" +
"webRequestUrl='" + webRequestUrl + '\'' +
", callbackAddress='" + callbackAddress + '\'' +
", getTokenUrl='" + getTokenUrl + '\'' +
", getOpenidUrl='" + getOpenidUrl + '\'' +
", getInfoUrl='" + getInfoUrl + '\'' +
", refreshTokenUrl='" + refreshTokenUrl + '\'' +
'}';
}
}
最重要的就是对于json加载的解析,并写入bean
实现BeanPostProcessor接口 并重写 postProcessBeforeInitialization的方法
@Component //注意:Bean后置处理器本身也是一个Bean
@Slf4j
public class MyAnnotationBeanPostProcessor implements BeanPostProcessor {
@SneakyThrows
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
MyConfigurationJson annotation = bean.getClass().getAnnotation(MyConfigurationJson.class);
if (null == annotation) {
return bean;
}
String prefix = annotation.prefix();
/**
* 利用Java反射机制注入属性
*/
//读取json文件注入bean
return ReadJson.read("qqConfig",prefix, bean.getClass());
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
return o; //这里要返回o,不然启动时会报错
}
}
读取json核心方法
public class ReadJson {
public static Object read(String path,String prefix,Class<?> clazz) throws IOException {
Resource resource=new ClassPathResource(path+".json");
InputStream inputStream=resource.getInputStream();
Map object = JSON.parseObject(inputStream, Map.class);
String o = object.get(prefix).toString();
return JSONObject.parseObject(o, clazz);
}
}
本案例通过运用bean的生命周期的知识,完成了动态的读取json文件并重新对bean进行赋值,最终可以在容器中拿到我们需要的单例对象配置信息,感谢大家的观看!!!