1.前置要求和授权登录原理
2.读取自定义json配置文件信息
3.获取跳转url和回调的接口
4.使用websocket和前端建立连接
5.对接qq登录的流程
1.后端 1.1引入websocket依赖本章是写对于前端的调用
实现前端和后端的结合,利用websocket使用建立连接
完成登录的整个流程
1.2configorg.springframework.boot spring-boot-starter-websocket
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
1.3webController
package top.chenyp.qqService.controller;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
@ServerEndpoint("/qq/{state}")
@Component
public class WsController {
//每个客户端都会有相应的session,服务端可以发送相关消息
private Session session;
//接收userID
private String state;
//J.U.C包下线程安全的类,主要用来存放每个客户端对应的webSocket连接
private static CopyOnWriteArraySet copyOnWriteArraySet = new CopyOnWriteArraySet();
public String getState() {
return state;
}
@OnOpen
public void onOpen(Session session, @PathParam("state") String state) {
this.session = session;
this.state = state;
System.out.println(this.state);
System.out.println(this.session.getId());
copyOnWriteArraySet.add(this);
System.out.println("websocket有新的连接, 总数:"+ copyOnWriteArraySet.size());
}
@OnClose
public void onClose() {
copyOnWriteArraySet.remove(this);
System.out.println("websocket连接断开, 总数:"+ copyOnWriteArraySet.size());
}
@OnMessage
public void onMessage(String message) {
System.out.println("websocket收到客户端发来的消息:"+message);
}
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误:" + error.getMessage() + "; sessionId:" + session.getId());
error.printStackTrace();
}
public void sendMessage(Object object){
//遍历客户端
for (WsController webSocket : copyOnWriteArraySet) {
System.out.println("websocket广播消息:" + object.toString());
try {
//服务器主动推送
webSocket.session.getBasicRemote().sendObject(object) ;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void sendMessage(String message) {
//遍历客户端
for (WsController webSocket : copyOnWriteArraySet) {
System.out.println("websocket广播消息:" + message);
try {
//服务器主动推送
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void sendMessage(String state, String message) throws Exception {
Session session = null;
WsController tempWebSocket = null;
for (WsController webSocket : copyOnWriteArraySet) {
System.out.println(state);
System.out.println(webSocket.getState());
if (webSocket.getState().equals(state) ) {
tempWebSocket = webSocket;
session = webSocket.session;
break;
}
}
if (session != null) {
//服务器主动推送
tempWebSocket.session.getBasicRemote().sendText(message);
} else {
System.out.println("没有找到你指定ID的会话:{}"+ "; state:" + state);
}
}
public static void sendInfo(String message) throws IOException {
for (WsController item : copyOnWriteArraySet) {
item.sendMessage(message);
}
}
}
2.前端



