Springboot WebSocket鉴权,前处理(添加过滤器)

这篇具有很好参考价值的文章主要介绍了Springboot WebSocket鉴权,前处理(添加过滤器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.maven坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.创建处理器

/**
 * @author zhong
 * webscoket 处理器
 */
@Component
public class CustomWebSocketHandler extends TextWebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(CustomWebSocketHandler.class);

    /**
     * 当前websocket连接集合
     */
    public static final ConcurrentHashMap<String, WebSocketSession> WEB_SOCKET_SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * 收到客户端消息时触发的回调
     *
     * @param session 连接对象
     * @param message 消息体
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) {
        logger.info("接受到消息【{}】的消息:{}", session.getId(), message.getPayload());
    }

    /**
     * 建立连接后触发的回调
     *
     * @param session 连接对象
     * @throws Exception
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String sessionId = getSessionId(session);
        // 如果存在则断开连接
        if (WEB_SOCKET_SESSION_MAP.containsKey(sessionId)) {
            WEB_SOCKET_SESSION_MAP.get(sessionId).close();
        }
        // 将新连接添加
        WEB_SOCKET_SESSION_MAP.put(sessionId, session);
        logger.info("与【{}】建立了连接", sessionId);
        sendMessage(sessionId, sessionId);
        logger.info("attributes:{}", session.getAttributes());

    }

    /**
     * 断开连接后触发的回调
     *
     * @param session 连接对象
     * @param status  状态
     * @throws Exception 异常
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        logger.info("连接对象【{}】断开连接,status:{}", getSessionId(session), status.getCode());
        // 关闭连接
        session.close(CloseStatus.SERVER_ERROR);
        // 删除对象
        WEB_SOCKET_SESSION_MAP.remove(getSessionId(session));
    }

    /**
     * 传输消息出错时触发的回调
     *
     * @param session   连接对象
     * @param exception 异常
     * @throws Exception 异常
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        logger.info("连接对象【{}】发生错误,exception:{}", session.getId(), exception.getMessage());
        // 如果发送异常,则断开连接
        if (session.isOpen()) {
            session.close();
        }
        WEB_SOCKET_SESSION_MAP.remove(getSessionId(session));
    }

    /**
     * 自定义判断 sessionId
     *
     * @param session 连接对象
     * @return sessionId
     */
    private String getSessionId(WebSocketSession session) {
        return (String) session.getAttributes().get("username");
    }

    /**
     * 发送消息
     *
     * @param sessionId 对象id
     * @param message   消息
     * @throws IOException IO
     */
    public void sendMessage(String sessionId, String message) throws IOException {
        WebSocketSession webSocketSession = WEB_SOCKET_SESSION_MAP.get(sessionId);
        if (webSocketSession == null || !webSocketSession.isOpen()) {
            logger.warn("连接对象【{}】已关闭,无法送消息:{}", sessionId, message);
        } else {
            webSocketSession.sendMessage(new TextMessage(message));
            logger.info("sendMessage:向{}发送消息:{}", sessionId, message);
        }
    }

    /**
     * 发送消息
     *
     * @param sessionId 对象id
     * @param data      数据
     * @throws IOException IO
     */
    public void sendMessage(String sessionId, Object data) throws IOException {
        sendMessage(sessionId, JSON.toJSONString(data));
    }

    /**
     * 获取所有的连接对象ID
     *
     * @return ids
     */
    public List<String> getSessionIds() {
        Enumeration<String> keys = WEB_SOCKET_SESSION_MAP.keys();
        List<String> ks = new ArrayList<>();
        while (keys.hasMoreElements()) {
            ks.add(keys.nextElement());
        }
        return ks;
    }
}

3.创建拦截器

/**
 * @author zhong
 * 用来处理webscocket拦截器
 */
@Component
public class CustomWebsocketInterceptor extends HttpSessionHandshakeInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(CustomWebsocketInterceptor.class);

    /**
     * 建立连接时
     *
     * @param request    the current request
     * @param response   the current response
     * @param wsHandler  the target WebSocket handler
     * @param attributes the attributes from the HTTP handshake to associate with the WebSocket
     *                   session; the provided attributes are copied, the original map is not used.
     * @return
     * @throws Exception
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        ServletServerHttpRequest req = (ServletServerHttpRequest) request;
        ServletServerHttpResponse res = (ServletServerHttpResponse) response;
        String token = req.getServletRequest().getParameter("token");
        String username = req.getServletRequest().getParameter("username");
        logger.info("建立连接....token:{} username:{}", token, username);
        logger.info("attributes:{}", attributes);
        attributes.put("token", token);
        attributes.put("username", username);
        /**
         * 鉴权: return false 不通过
         *  response.setStatusCode(HttpStatus.UNAUTHORIZED);
         *  return false;
         */
        super.setCreateSession(true);
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    /**
     * 成功建立连接后
     *
     * @param request   the current request
     * @param response  the current response
     * @param wsHandler the target WebSocket handler
     * @param exception an exception raised during the handshake, or {@code null} if none
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
        logger.info("连接成功....");
        //其他业务代码
        super.afterHandshake(request, response, wsHandler, exception);
    }
}

3.创建配置文件

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Resource
    private CustomWebsocketInterceptor customWebsocketInterceptor;

    @Resource
    private CustomWebSocketHandler customWebSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry
                // 设置处理器处理/custom/**
                .addHandler(customWebSocketHandler,"/custom")
                // 允许跨越
                .setAllowedOrigins("*")
                // 设置监听器
                .addInterceptors(customWebsocketInterceptor);
    }

}

文章来源地址https://www.toymoban.com/news/detail-558320.html

到了这里,关于Springboot WebSocket鉴权,前处理(添加过滤器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • GateWay网关自定义过滤器实现token校验完成统一鉴权

    gateWay---API网关,也可以称为业务网关,主要服务于微服务的; (1)  三大组件 路由(Route)         构建网关的基本模块,由id(唯一标示)、目标URI、一组断言、一组过滤器组成,如果断言为true,则匹配该路由   断言(Predicate)          可以使用它匹配来自HTTP请求的任何

    2024年02月08日
    浏览(38)
  • SpringBoot为WebSocket添加安全认证与授权功能

    作者:禅与计算机程序设计艺术 19年初,Spring 推出了 Spring Websocket 技术,这是一种基于WebSocket协议的消息通信框架,用于快速开发WebSocket API。在实际应用中,WebSocket 可以很好的降低服务器负载、节省带宽资源并提供实时数据传输。但是,由于WebSocket本身没有身份验证机制、

    2024年02月09日
    浏览(28)
  • WebSocket 鉴权策略与技巧详解

    WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应手。 WebSocket 鉴权在许多场景中都显得尤为重要。例如

    2024年01月17日
    浏览(24)
  • WebSocket 鉴权实践:从入门到精通

    WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应手。 WebSocket 鉴权在许多场景中都显得尤为重要。例如

    2024年03月25日
    浏览(24)
  • netty-websocket 鉴权token及统一请求和响应头(鉴权控制器)

    自己想法和实现,如果有说错的或者有更好的简单的实现方式可以私信交流一下(主要是实现握手时鉴权) 握手鉴权是基于前台请求头 Sec-WebSocket-Protocol的 本身socket并没有提供自定义请求头,只能自定义 Sec-WebSocket-Protocol的自协议 socket握手请求是基于http的,握手成功后会升级为

    2024年02月04日
    浏览(23)
  • nacos添加鉴权

    非docker方式,nacos添加鉴权 maven的pom文件 spring-cloud-alibaba-dependencies nacos的config和discovery 修改nacos的配置文件application.properties 3. 进入nacos,如果不用默认的public就需要创建新的命名空间或者在克隆原有配置文件的时候添加 4. 添加用户 创建角色 添加权限 修改项目中的bootstrap.yml文

    2023年04月08日
    浏览(22)
  • WebApi中添加Jwt鉴权

    JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。针对前后端

    2024年02月08日
    浏览(29)
  • netty-websocket扩展协议及token鉴权补充

    文章源码: gitee 源码部分可以看上一篇文章中的源码分析netty-websocket 鉴权token及统一请求和响应头(鉴权控制器) 最近刚好没事,看到有朋友说自定义协议好搞,我就想了想,发现上面那种方式实现确实麻烦,而且兼容性还不行,后来我对照着WebSocketServerProtocolHandler试了试

    2024年02月22日
    浏览(27)
  • nacos添加权限控制的鉴权功能

    nacos如果使用权限控制的鉴权功能,需要在配置文件添加特定参数,我这边是k8s部署的,需要在k8s yaml文件中添加如下参数才能使用权限控制的鉴权功能: 如果是非docker和k8s环境的,可以直接修改application.properties文件: 开启鉴权之后,application.properties中的配置信息为: 鉴权

    2024年02月16日
    浏览(49)
  • ASP.NET Core 鉴权授权三(添加自定义授权策略)

    此处鉴权给的值是6,授权用的1,尝试访问 基于策略的授权中有一个很重要的概念是Requirements,每一个Requirement都代表一个授权条件。 Requirement需要继承接口IAuthorizationRequirement。 已经内置了一些常用的实现: AssertionRequirement :使用最原始的断言形式来声明授权策略。 DenyAn

    2024年02月03日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包