Java微信扫码登录+websocket通知前端

1,vue前端登录页面
<script>
  export default {
    name: "login",
    data() {
      return {
        path: "ws://www.david10.com/studyassistant/websocket/",
        socket: "",
        date: Date.parse(new Date()),//时间戳
        mywin: '',//打开的窗口
      }
    },
    mounted() {
      this._jq();
      // this.webSocketFun();
      this.init();
      // this.wxChange()
    },
    methods: {
      roters() {
        this.$router.push({path: '/serviceText', query: {}});
      },

      init: function () {
        if (typeof (WebSocket) === "undefined") {
          alert("您的浏览器不支持socket")
        } else {
          // 实例化socket
          this.socket = new WebSocket(this.path + this.date)
          // 监听socket连接
          this.socket.onopen = this.open
          // 监听socket错误信息
          this.socket.onerror = this.error
          // 监听socket消息
          this.socket.onmessage = this.getMessage
        }
      },
      open: function () {
        console.log("socket连接成功")
        // this.wxChange();
      },
      error: function () {
        console.log("连接错误")
      },
      getMessage: function (msg) {
        // console.log('msg',msg)
        this.mywin.close();
        let data = JSON.parse(msg.data);
        if (data.code == 0) {
          this.$notify({
            title: '成功',
            message: '登录成功',
            type: 'success'
          });
          this.$store.commit('tokenAdd', data.msg);
          this.$store.commit('yesLogin');
          window.sessionStorage.setItem("isLogin", true);
          window.sessionStorage.setItem("token", data.msg);
          this.$router.push({path: '/index', query: {wx:data.msg}});
          //进来之后要改变默认token的值变成空,写在mian.js里面的赋值的东西不会默认改变的
          this.$http.defaults.headers.common['Authorization'] = data.msg;
        }
        if (data.code == 1) {
          this.$notify.error({
            title: '错误',
            message: data.msg
          });
          // console.log(data.msg)
        }

      },
      send: function () {
        this.socket.send(params)
      },
      close: function () {
        console.log("socket已经关闭")
      },

      //微信改变样式
      wxChange() {
        // let This = this;
        this.mywin = window.open("https://open.weixin.qq.com/connect/qrconnect?appid=&redirect_uri=&response_type=code&scope=snsapi_login&state=" + this.date + "#wechat_redirect", "", "width=500px,height=500px");

      //设置高度
      _jq() {
        $('.login').height($(window).height())
      },
    },
    destroyed() {
      // 销毁监听
      this.socket.onclose = this.close
    }
  }
</script>
2,websocket配置
(1)maven依赖:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
</dependency>
(2)ChatInterceptor.java
public class ChatInterceptor extends HttpSessionHandshakeInterceptor {
    /**
     *
     * @param request 请求
     * @param response 响应
     * @param wsHandler 处理器
     * @param attributes 请求的属性,会被传递到我们的handler中
     * @return  返回true代表放行 ,false代表拦截
     * @throws Exception
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
       //我们可以在这里向属性中添加一个值,这个值我们可以用作标记, map的key我们随意,只要能保证唯一性以及记住就行
        String s = request.getURI().toString();//获取请求地址,我们要求了 最后一个/后面是标记
        String name = s.substring(s.lastIndexOf("/" )+ 1);
        attributes.put("name", name);
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        super.afterHandshake(request, response, wsHandler, ex);
    }
}
(3)ChatMessageHandler.java
public class ChatMessageHandler extends TextWebSocketHandler {

    private static Map<String, WebSocketSession> allClient = new ConcurrentHashMap<>();

    public static Map<String, WebSocketSession> getAllClient() {
        return allClient;
    }

    /**
     *  当链接建立的时候执行, 相当于我们普通情况下 onOpen
     * @param session
     * @throws Exception
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        //保存到map中
        Map<String, Object> attributes = session.getAttributes();//拦截器中的那个map,里面放着我们的name
        allClient.put((String) attributes.get("name"), session);//保存了所有的链接
        super.afterConnectionEstablished(session);
    }

    /**
     * 处理文本消息 相当于我们的onMessage
     * @param session
     * @param message
     * @throws Exception
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {


    }

    /**
     * 连接关闭 相当于 onClose
     * @param session
     * @param status
     * @throws Exception
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
    }
}
(4)WebSocketConfig.java
@Configuration
@EnableWebSocket//开启websock
public class WebSockertConfig implements WebSocketConfigurer {

    /**
     * 注册websock 处理器,其实就是最终谁来处理请求
     * @param webSocketHandlerRegistry
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
        //注册websock的地址为/websocket/* 并添加了一个拦截器, 拦截器中会将请求地址中的最后一部分放入到map中传递到我们的handler中,.我们要求了最后一部分就是标记
        webSocketHandlerRegistry.addHandler(new ChatMessageHandler(),"/websocket/*").addInterceptors(new ChatInterceptor()).setAllowedOrigins("*");
    }
}
3,微信登录回调后台接口
/**
     * V2.0.0微信扫码登录
     * @param code 微信回调的code
     * @param state 通信需要用到的标记
     */
    @RequestMapping("/callback")
    public void callback(String code,String state){
        Jedis jedis =null;
        logger.info("进入授权回调,code:{},state:{}",code,state);
        //1.通过code获取access_token
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        url = url.replace("APPID","你的id").replace("SECRET","你的secret").replace("CODE",code);
        String tokenInfoStr = HttpUtil.postData(url,"");
        logger.info("tokenInfoStr =========>"+tokenInfoStr);
        JSONObject tokenInfoObject = JSON.parseObject(tokenInfoStr);
        //2.通过access_token和openid获取用户信息
        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
        userInfoUrl = userInfoUrl.replace("ACCESS_TOKEN",tokenInfoObject.getString("access_token")).replace("OPENID",tokenInfoObject.getString("openid"));
        String userInfoStr =  HttpUtil.postData(userInfoUrl,"");
        logger.info("userInfoObject:{}",userInfoStr);
        JSONObject jsStr = JSON.parseObject(userInfoStr);
        //3.获取信息

        String nickname = jsStr.getString("nickname");
        String headimgurl = jsStr.getString("headimgurl");
        String unionid = jsStr.getString("unionid");


        try {
                //你的登录逻辑代码
               
                //通过websocket通知登录成功并返回微信id
                WebSocketSession session = ChatMessageHandler.getAllClient().get(state);
                if  (session != null && session.isOpen()) {
                    ResultBean resultBean = ResultBean.setError(0, unionid);
                    String resultjson = JSON.toJSONString(resultBean);
                    session.sendMessage(new TextMessage(resultjson));
                }else {
                    ResultBean resultBean = ResultBean.setError(1, "请检查你的网络");
                    String resultjson = JSON.toJSONString(resultBean);
                    session.sendMessage(new TextMessage(resultjson));
                    logger.error("会话连接出错");
                }

        }catch (Exception e){
            e.printStackTrace();
            logger.error("微信登录失败");
        }

    }
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用RabbitMQ、Spring Boot和WebSocket来实现前端可发送和接收消息的功能。下面是一个基本的实现步骤: 1. 首先,确保您的Spring Boot项目中已经添加了RabbitMQ和WebSocket的依赖。 2. 在Spring Boot应用程序中配置RabbitMQ,包括连接配置和队列配置。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`ConnectionFactory`和一个`RabbitTemplate`实例。 3. 创建一个消息接收器(Consumer)来监听RabbitMQ队列中的消息。您可以使用`@RabbitListener`注解将一个方法标记为消息接收器,并指定要监听的队列名称。 4. 在Spring Boot应用程序中配置WebSocket,包括处理器和拦截器等。您可以使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`WebSocketHandler`和一个`HandshakeInterceptor`实例。 5. 创建一个WebSocket处理器(Handler)来处理前端发送的消息。您可以实现`WebSocketHandler`接口,并重写相应的方法来处理连接、消息发送和关闭等事件。 6. 在WebSocket处理器中,您可以使用RabbitTemplate将接收到的消息发送到RabbitMQ队列中。您可以在处理器的`handleTextMessage()`方法中调用RabbitTemplate的相关方法来发送消息。 7. 在前端页面中,使用JavaScript或其他框架来建立WebSocket连接,并发送和接收消息。您可以使用WebSocket的API来发送和接收消息,并在接收到消息时更新页面内容。 通过以上步骤,您可以实现前端可发送和接收消息的功能。当前端发送消息时,WebSocket处理器会接收到消息并将其发送到RabbitMQ队列中。然后,消息接收器会监听该队列,并将消息发送给其他需要接收该消息的客户端。这样,前端页面就可以实现实时的消息发送和接收功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值