DE32FinalTeam2 / JavaWithKafka

0 stars 0 forks source link

WebSocket Stomp 사용시 기본 제공 메소드에서 IP를 가져올 수 없는 이슈 #11

Open GITSangWoo opened 2 days ago

GITSangWoo commented 2 days ago

WebSocketconfig.java

 @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new YourWebSocketHandler(), "/your-endpoint")
                .addInterceptors(new CustomHandshakeInterceptor()); // 인터셉터 추가
    }

Controller.java

@Controller
public class MessageController {

    @MessageMapping("/sendMessage")
    @SendTo("/topic/messages")
    public Message sendMessage(Message message, SimpMessageHeaderAccessor headerAccessor) {
        String ipAddress = (String) headerAccessor.getSessionAttributes().get("ipAddress");
        // IP 주소를 사용하여 필요한 로직 처리
        message.setIpAddress(ipAddress); // 예시로 메시지에 IP 추가
        return message;
    }
}

위 같은 SImpMessageHeaderAccessor에서 ipAddress를 받아 와보려고 했지만 받아지지 않습니다.

image

GITSangWoo commented 2 days ago

해결 방법

app.js 에서 api를 통해 ip 값을 받고 stompclient에 message를 보낼때 같이 보낼 수 있게 코드를 추가 했습니다.

//header 만들기
function sendMessage() {
    const message = $("#message").val();
    const name = $("#name").val();

    fetch('https://ipinfo.io/?token=발급받은토큰값넣기')
        .then(response => response.json())
        .then(data => {
            const ipAddress = data.ip;
            console.log('Your IP address is:', ipAddress);

            // IP 주소를 받은 후에 메시지 전송 로직 실행
            stompClient.send("/app/hello", {}, JSON.stringify({
                'name': name,
                'message': message,
                'clientIp': ipAddress
            }));

            $("#message").val(''); // 입력 필드 초기화
        })
        .catch(error => {
            console.error('Error fetching IP address:', error);
        });
}

HelloMessage.java

package com.websocket.socket.message;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class HelloMessage {
    private String name;
    private String message;
    private String clientIp;
}
@MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message, @RequestHeader Map<String, String> header,  String message2) throws Exception {
        Thread.sleep(200); // simulated delay

        // 현재 시간 포맷 지정
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedTime = now.format(formatter);

        // 순번을 포함한 Kafka에 메시지를 전송할 메시지 포맷
        String processedMessage = message.getClientIp() + " , " + "[" + formattedTime + "] " + message.getName() + " : " + HtmlUtils.htmlEscape(message.getMessage());
        String proMessage = header.get("clientIp")+" , " + formattedTime + " , " + message.getName() + " , " + HtmlUtils.htmlEscape(message.getMessage());

});

추가로 알게 된 점

stompClient.send()를 이용해 메세지를 보낼때 Json.stringfy를 사용할때는 stringfy안에 딕셔너리 방식으로 값을 추가하지 않으면 message 내용에 값이 포함 안됌, header로도 받을 수 있고, Hellomessage message으로도 값을 받을 수 있음

출력 결과(위 playdata에서 메세지 보냈을때, 집에서 메세지 보냈을때)

image

참고사이트 ip 주소 api 사이트

https://ipinfo.io/