Websocket实现token认证方式

这篇具有很好参考价值的文章主要介绍了Websocket实现token认证方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Websocket实现token认证方式

1.将token放到header中
java客户端代码展示
@Slf4j
public class Demo {
    public static void main(String[] args) {
        String currentPersonId = "wangwu";
        WebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.addHeader("token", "sadfasdfasdfsdf");
        webSocketClient.connectBlocking();
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.err.println(currentPersonId + " -> ");
            String message = scanner.nextLine();
            webSocketClient.send(message);
        }
    }
}
2.将token放在url上
ws://xxx.com?token=asdfjhsakjdfhskdjhfa
java客户端代码展示
@Slf4j
public class Demo {
    public static void main(String[] args) {
        String currentPersonId = "wangwu";
        WebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId 
                                + "?token=asdfjhsakjdfhskdjhfa"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.connectBlocking();
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.err.println(currentPersonId + " -> ");
            String message = scanner.nextLine();
            webSocketClient.send(message);
        }
    }
}
3.将token放到 WebSockets的Sec-WebSocket-Protocol中
java客户端代码展示
@Slf4j
public class Demo {
    public static void main(String[] args) {
        String currentPersonId = "wangwu";
        WebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.addHeader("Sec-WebSocket-Protocol", "sadfasdfasdfsdf");
        webSocketClient.connect();
        webSocketClient.connectBlocking();
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.err.println(currentPersonId + " -> ");
            String message = scanner.nextLine();
            webSocketClient.send(message);
        }
    }
}

第一种方式很好理解,正常http协议也是这么做的;但是前端的websocket client js 不支持传递header,所以就出现了第二种和第三种写法。其中尤其要注意第三种写法,使用第三种写法其实是使用websocket子协议这个请求头的key,所以你的服务端需要在response中返回同样的headr的key和value,否则客户端会直接断开连接。

java服务端代码展示
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import java.util.Map;

public class MyWebSocketInterceptor extends HttpSessionHandshakeInterceptor {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        logger.info("[MyWebSocketInterceptor#BeforeHandshake] Request from " + request.getRemoteAddress().getHostString());
        if (request instanceof ServletServerHttpRequest){
            ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
            // 第一种取header中的值
            // String token = serverHttpRequest.getServletRequest().getHeader("token");
            // 第二种取url中的值
            // String token = ((ServletServerHttpRequest) request).getServletRequest().getParameter("token");
            // 第三种 需要返回相同的header
            String token = serverHttpRequest.getServletRequest().getHeader("Sec-WebSocket-Protocol");
            response.getHeaders().set("Sec-WebSocket-Protocol", token);
            
            //这里做一个简单的鉴权,只有符合条件的鉴权才能握手成功
            if ("token-123456".equals(token)){
                return super.beforeHandshake(request, response, wsHandler, attributes);
            }else {
                return false;
            }
        }
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        logger.info("[MyWebSocketInterceptor#afterHandshake] Request from " + request.getRemoteAddress().getHostString());
    }
}
前端代码演示
// 第二种方式   中括号内的就是子协议
const socket = new WebSocket('ws://xxx.com/ws?toekn=asdkjfhask');

// 第三种方式   中括号内的就是子协议
const socket = new WebSocket('ws://xxx.com/ws', ['my-token']);
socket.send('msg');

websocket使用springboot如何实现可以看看http://events.jianshu.io/p/1174b92e44d7文章来源地址https://www.toymoban.com/news/detail-527680.html

到了这里,关于Websocket实现token认证方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 持久双向通信网络协议-WebSocket-入门案例实现demo

    1 介绍 WebSocket 是基于 TCP 的一种新的 网络协议 。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接, 并进行 双向 数据传输。 HTTP协议和WebSocket协议对比: HTTP是 短连接 (一次响应完即消除) WebSocket是 长连接

    2024年01月16日
    浏览(47)
  • Springboot实现websocket(连接前jwt验证token)

    用户连接服务器weksocket前,需经过jwt的token验证(token中包含账号信息),验证合法后,才可以于服务器正常交互。 一、配置依赖(pom.xml) 二、因为springboot的websocket连接时不会显示header信息,也就无法拿到cookie中的token信息,需要在连接前处理,新建一个WebSocketConfig.class,在

    2024年02月03日
    浏览(83)
  • WebSocket 网络协议(实时更新 )

    WebSocket 是一种在客户端和服务器之间建立双向通信信道的网络协议。它在客户端和服务器之间建立一个持久的、全双工的连接,允许数据在两个方向上实时传输,而不需要像HTTP一样进行多次请求和响应。  WebSocket 的主要优势是减少了服务器和客户端之间的通信延迟,因为数

    2024年01月17日
    浏览(50)
  • Java SpringBoot集成WebSocket根据登陆权限认证

    Java SpringBoot集成WebSocket

    2024年02月12日
    浏览(45)
  • 【spring(六)】WebSocket网络传输协议

    🌈键盘敲烂,年薪30万🌈 目录 核心概要: 概念介绍: 对比HTTP协议:⭐ WebSocket入门案例:⭐ websocket对比http         WebSocket是Web服务器的一个组件,WebSocket是一种基于TCP的新的 网络传输协议 ,它实现了浏览器与服务器全双工通信——浏览器只需要完成 一次握手 ,两者之

    2024年02月05日
    浏览(44)
  • WebSocket | 基于TCP的全双工通信网络协议

    ​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 📕所属专栏:Java EE ✈ 您的一键三连,是我创作的最大动力🌹 WebSocket 是基于 TCP 的一

    2024年02月19日
    浏览(77)
  • WebSocket协议在java中的使用

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年04月10日
    浏览(41)
  • SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

    章节 第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现) 第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现) 本节主要介绍的是springboot实现websocket的客户端服务端,以及客户端与服务端的数据互传。以下为伪代码,业务逻辑删除导致不

    2024年02月12日
    浏览(51)
  • 网络通信协议-HTTP、WebSocket、MQTT的比较与应用

    在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTP (超文本传输协议) HTTP  是最常见的协议之一

    2024年02月05日
    浏览(61)
  • 使用Token方式实现用户身份鉴权认证

    Token,也称为“令牌”,是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。比如如下形式: 39faf62271944fe48c4f1d69be71bc9a 传

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包