Contents
see List작성일 2016. 02. 08.
필요 maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${org.springframework-version}</version>
</dependency>
//Stomp 전역 세션관리를 위한 싱글톤빈
public class StompSetBean {
private Set<CommStompSesBean> connections = new CopyOnWriteArraySet<CommStompSesBean>();
public Set<CommStompSesBean> getConnections() {
return connections;
}
}
//Stomp 접속 및 해제 핸들러
public class StompHandler extends ChannelInterceptorAdapter {
@Autowired
private CommMainService service;
@Autowired
private StompSetBean sesBean;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(message);
if (sha.getCommand() == null) {
return;
}
Set<CommStompSesBean> conns = sesBean.getConnections();
String sessionId = sha.getSessionId();
String userId = sha.getUser().getName();
CommStompSesBean commStompSesBean = new CommStompSesBean(userId,sessionId);
switch (sha.getCommand()) {
case CONNECT:
conns.add(commStompSesBean);
conns.stream().forEach(value -> logger.info(value.toString()));
break;
case DISCONNECT:
conns.remove(commStompSesBean);
break;
default:
break;
}
}
}
//Stomp 설정을 위한 config
@Configuration
@EnableWebSocketMessageBroker
public class StopmConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Value("${hdl.comm.echo.stomp.url}")
private String echoUrl;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(echoUrl);//서버 쪽 연결
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");//클라이언트 메세지
registry.setApplicationDestinationPrefixes("/app");//서버 전송 메세지
}
@Bean
public StompSetBean stompSetBean() {
return new StompSetBean();
}
@Bean
public StompHandler stompHandler() {
return new StompHandler();
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(50);
return executor;
}
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(stompHandler());
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(8);
registration.setInterceptors(stompHandler());
}
}
//컨트롤러
@Controller
public class CommStompController {
@Autowired
private SimpMessagingTemplate template;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private StompSetBean sesBean;
@MessageMapping("${hdl.comm.echo.stomp.url}")
public void sendEcho(CommStompSesBean hello, Principal principal,SimpMessageHeaderAccessor headerAccessor)throws Exception {
Set<CommStompSesBean> conns = sesBean.getConnections();
hello.setWsId(principal.getName());//보내는사람
Map<String, Object> ss = headerAccessor.getMessageHeaders();
logger.info(ss.toString());
if(PhychodeUtil.isNotEmpty(hello.getUserId())){
template.convertAndSendToUser(hello.getUserId(), "/topic/echo",hello);//개인쪽지
logger.info(hello.toString());
}else{
conns.stream().forEach(ses -> {
if(!ses.getUserId().equals(hello.getWsId())){
hello.setUserId(ses.getUserId());//받는사람
logger.info(hello.toString());
template.convertAndSendToUser(ses.getUserId(), "/topic/echo",hello);//전체쪽지
}
});
}
//template.convertAndSend("/topic/echo","dd");
}
}
//client
$name = '';
$message = '지랄';
function init() {
var socket = new WebSocket('ws://'+location.host+'<c:url value="${echoUrl}"/>');
$client = Stomp.over(socket); //Stomp client 구성
$client.connect({}, function(frame) {
console.log('connected stomp over sockjs');
// subscribe message
$client.subscribe('/user/topic/echo', function(message) {
console.log('receive subscribe');
alert(message);
});
});
};
// send message
function send() {
var data = {
userId: $name,
msg: $message
};
$client.send('/app${echoUrl}', {}, JSON.stringify(data));
};
spring
| No | 작성일 | Title |
|---|---|---|
| 2005 | 2025. 11. 30. | Spring Security 6 JWT 인증 구현 |
| 2004 | 2025. 11. 30. | Spring Boot 3.x 새로운 기능 정리 |
| 1824 | 2022. 05. 24. | [ spring ] interceptor 등 스프링에서 @Autowired 인식을 못할때 |
| 421 | 2016. 08. 02. | [ spring-security ] 스프링 시큐리티 csrf (크로스도메인) 설정방법 |
| 349 | 2016. 02. 16. | [ spring ] spring4 jsonp callback |
| 346 | 2016. 02. 08. | [ spring 4 ] 스프링 4 websocket 및 stomp (채팅 및 쪽지 구현) |
| 344 | 2016. 02. 06. | [ spring-security ] 스프링 시큐리티 4 버전에서 hasRole 및 hasAnyRole 안될경우 |
| 328 | 2015. 11. 05. | [ spring security ] 스프링 시큐리티 유저정보 얻는 방법 |
| 311 | 2015. 06. 30. | [ spring ] IOException while loading persisted sessions: java.io.EOFException 해결 |
| 310 | 2015. 06. 29. | [ spring ] How To Get HTTP Request Header In spring ( 스프링에서 http header 값 가져오기) |