springboot集成websocket通过自定义注解+切面实现实时消息提醒

        上一篇文章介绍springboot如何集成websocket,而我们的需求是当上一个人审核通过了下一个人能实时的收到提醒。所有还需要进一步的升级,实现思路:①在上一个人审核操作的方法上打上一个aop拦截的自定义注解②在aop中执行发送消息操作

1.自定义注解

/**
 * (描述该文件)
 * @author tlj
 * @date 2018年9月15日 上午10:37:31
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface UserMessage {

}

2.aop类,UserMessageSocket 是上一篇文章中的服务器消息处理类

/**
 * (消息提醒的切面)
 * @author tlj
 * @date 2018年9月14日 上午10:41:31
 */
@Aspect
@Component
public class MessageAop {

    private Logger log = LoggerFactory.getLogger(this.getClass());
    @Autowired
    UserMessageSocket userMessageSocket;
	 
    /**
     * 切点
     */
	@Pointcut(value = "@annotation(com.dechy.mis.core.common.annotion.UserMessage)")
    public void cutService() {
    }

    /**
     * 通知
     * @param point
     * @return
     * @throws Throwable
     */
    @Around("cutService()")
    public Object getUserMessage(ProceedingJoinPoint point) throws Throwable {

        //1.先执行业务
        Object result = point.proceed();

        try {
            //2.执行aop方法
            handle(point);
        } catch (Exception e) {
           log.error("执行消息提醒切面异常");
        }

        return result;
    }

    private void handle(ProceedingJoinPoint point) throws Exception {

        //1.获取拦截的方法名
        Signature sig = point.getSignature();
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }
        //2.发送消息
        userMessageSocket.sendInfo();
        
    }
}

3.需要打注解的方法,那个方法会影响待办事项的个数,按个方法就打上注解就完事。

 

4.到此大功告成,感谢自己能够用文章记录自己的成长。

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现自定义请求头的鉴权,可以通过在 WebSocket 握手过程中进行处理来实现。 具体步骤如下: 1. 自定义一个 `HandshakeInterceptor` 类,重写 `beforeHandshake()` 方法,在该方法中获取并验证请求头的鉴权信息。 例如: ```java public class AuthHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { if (request.getHeaders().containsKey("Authorization")) { String token = request.getHeaders().getFirst("Authorization"); // 进行鉴权验证 if (isValidToken(token)) { // 鉴权成功,将鉴权信息存储到 attributes 中 attributes.put("token", token); return true; } } return false; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { // do nothing } private boolean isValidToken(String token) { // 鉴权验证逻辑 return true; } } ``` 2. 在 WebSocket 配置类中注册该拦截器。 例如: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired private AuthHandshakeInterceptor authHandshakeInterceptor; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myWebSocketHandler(), "/my-websocket") .addInterceptors(authHandshakeInterceptor) .setAllowedOrigins("*"); } @Bean public WebSocketHandler myWebSocketHandler() { return new MyWebSocketHandler(); } } ``` 在以上示例中,我们将自定义的 `AuthHandshakeInterceptor` 注册到了 WebSocket 配置类中,并在 `registerWebSocketHandlers()` 方法中通过 `addInterceptors()` 方法添加了该拦截器。 这样,在客户端连接 WebSocket 时,WebSocket 握手过程中会执行 `beforeHandshake()` 方法,进行请求头的鉴权验证。如果鉴权失败,则连接会被拒绝;如果鉴权成功,则将鉴权信息存储到 `attributes` 中,供后续使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值