Luego, imprimirá los mensajes enviados antes de que el usuario se suscriba al chat (diferenciando entre los mensajes enviados por el usuario local y los demás miembros del chat):
Se definen las plantillas del manubrio para los mensajes:
12345678910111213141516171819202122232425262728293031<scripttype="text/x-handlebars-template"³;li fa-circulo en línea scripttype="text/x-handlebars-template"³;li align-right"³;span fa-circle me"³;/i>;div other-message float-right"³{{{{{msg}}</div
html
Y las variables del servidor se imprimen usando la sintaxis de Thymeleaf para Javascript en línea:
Para obtener la llave de empuje, modifiquemos el código del controlador. Pero primero, definamos un objeto de configuración que tome los valores de la API de Pusher de las variables de entorno (o línea de comandos):
123456789101112131415161718192021222324252627@ComponentpublicclassPusherSettings{ /** Pusher App ID */@Value("${pusher.appId}")privateString appId; /** Pusher Key */@Value("${pusher.key}")privateString key; /** Pusher Secret */@Value("${pusher. secret}")privateString secret; /** * Crea una nueva instancia del objeto Empujador para usar su API * * @return Una instancia del objeto Empujador */publicPushernewInstance(){returnnewPusher(appId, key, secret);}publicStringgetPusherKey(){return key;}}
java
Los valores de las propiedades pueden ser inyectados directamente en los frijoles usando la anotación @Valor y son accesibles después de que un frijol ha sido construido.
Ahora, en el ChatController, inyecta una instancia de este objeto:
En el MVC 4 de primavera, si su controlador está anotado con @RestController en lugar de @Controller, no necesita la anotación @ResponseBody para especificar las respuestas formateadas como JSON.
Vamos a cablear los servicios que necesitaremos (note la anotación@PostConstrucción en el método que crea la instancia de empuje):
123456789101112131415161718192021222324@RestControllerpublicclassPusherController{privateLogger logger =LoggerFactory.getLogger(PusherController. class);@AutowiredprivateChatService chatService;@AutowiredprivateUserService userService;@AutowiredprivatePusherSettings pusherSettings;privatePusher pusher; /** * Método ejecutado después de crear el objeto * que crea una instancia del objeto Pusher */@PostConstructpublicvoidcreatePusherObject(){ pusher = pusherSettings.newInstance();}}
java
Después de eso, definamos el punto final de autenticación para el chat de presencia:
Finalmente, necesitamos definir el método que manejará las solicitudes de webhook de Pusher:
123456789101112131415161718192021222324252627282930313233343536373839404142@RestControllerpublicclassPusherController{...@RequestMapping(value ="/pusher/webhook", method =RequestMethod. POST, consume ="application/json")publicStringwebhook(@RequestHeader(value="X-Pusher-Key")String key,@RequestHeader(value="X-Pusher-Signature")String signature,@RequestBodyString json)lanzaJsonParseException,JsonMappingException,IOException{Validez válida = empujador. validarFirma de GanchoWeb(clave, firma, json);si(Validez.VALIDA.es igual a(válido)){Mapper mapeador de objetos = nuevoMapperObjecto();Solicitud de GanchoWeb del Empujador = mapper.readValue(json,Solicitud de GanchoWeb del Empujador. class);if(request.getEvents()!=null){for(PusherWebhookRequest.Event event : request.getEvents()){switch(event.getName()){case "channel_occupied": logger.info("channel_occupied: "+ event.getChannel());break;case "channel_vacated": logger.info("channel_vacated: "+ event.getChannel()); chatService.markChatAsInactive(event.getChannel().replace(GeneralConstants.CHANNEL_PREFIX,""));break;case "member_added": logger.info("member_added: "+ event.getUserId());break;case "member_removed": logger.info("member_removed: "+ evento.getUserId()); userService.markUserAsInactive(event.getUserId());break;}}}}regresar "OK";}}
java
En el código de arriba, verificamos que la solicitud proviene de Pusher. Los WebHooks válidos contendrán estos encabezados:
X-Pusher-Key: La llave API del Empujador actualmente activa.
Firma del Empujador X: Un compendio hexagonal HMAC SHA256 formado por la firma de la carga útil POST (cuerpo) con el secreto de la ficha APIS del Empujador
Para realizar la autenticación, la biblioteca de Pusher requiere estos encabezados y el cuerpo de la solicitud como argumentos para validar el método de WebhookSignature:
1Validez válida = pusher.validateFirma de gancho web (clave, firma, json);
java
Si la petición es válida, el objeto JSON se convierte en un objeto de tipo PusherWebhookRequest. Estas son solicitudes de muestra en formato JSON:
Finalmente, el evento se maneja de acuerdo a esto (para eventos channel_vacated el chat se marca como inactivo y para eventos member_removed, el usuario también se marca como inactivo).
La funcionalidad del chat está completa, ahora lo único que falta es la firma del documento NDA.