WebSocket

[WebSocket] Interceptor 사용 및 검증 절차 방법 /HttpSessionHandShakeInterceptor 사용

Jeong Jeon
반응형

1). Servlet-context.xml 에 Interceptor 및 Handler Bean 등록

핸들러와 Interceptor를 등록해준다.

	<!-- 웹소켓 요청 -->
	<!-- 핸들러 등록 -->
	<websocket:handlers allowed-origins="*">
        <websocket:mapping path="/socketChannel" handler="manageChannelHandler"/>
        <websocket:handshake-interceptors>
	       <beans:bean class="com.test.spring.interceptor.WebSocketHandShakeInterceptor"/>
		</websocket:handshake-interceptors>
    </websocket:handlers>
    <beans:bean id="manageChannelHandler" class="com.test.socket.ManageSocketHandler"/>

 

2). HttpSessionHandShakeInterceptor Override 작성 => WebSocketHandShakeInterceptor.java

Interceptor로 우리는 HttpSession을 이용하려고한다.

Handler로 넘겨서 사용할 데이터는 별도로 attributes에 담아서 넘겨줘도 되니 확인!

public class WebSocketHandShakeInterceptor extends HttpSessionHandshakeInterceptor {
    /**
     * @desc 웹소켓 핸드쉐이크 전 호출 메소드
     */
 @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
            Map<String, Object> attributes) throws Exception {
        // TODO Auto-generated method stub
        if (request instanceof ServletServerHttpRequest) {
            ServletServerHttpRequest servletServerRequest = (ServletServerHttpRequest) request;
            HttpServletRequest servletRequest = servletServerRequest.getServletRequest();

            HashMap<String,String> queryMap = StringTool.getQueryMap(servletRequest.getQueryString());

            String deviceVariety = queryMap.get("deviceVariety");
            String token = queryMap.get("sid");
            int companyId =0;
            String clientMacAddress = "";

            if(!deviceVariety.equals(Constant.DEVICE_WEB)) {
                companyId = Integer.parseInt(queryMap.get("companyId"));
                clientMacAddress = queryMap.get("clientMacAddress");
            }

            //관리자 브라우저 일때
            if(deviceVariety.equals(Constant.DEVICE_WEB)) {
                if(StringUtils.isEmpty(token)) {
                    return false;
                }
                //로그인 된 회원 여부 체크 코드
                
                //로그인 처리 되어 있는 경우에 세션아이디 어트리뷰트를 넣어줌.
                //필요 정보 넘겨주기 => 핸들러로
                attributes.put("deviceVariety", deviceVariety);
                attributes.put("sid", token);
                return super.beforeHandshake(request, response, wsHandler, attributes);
           }
    }

    /**
     * @desc 웹소켓 핸드쉐이크 후 호출 메소드
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
            Exception ex) {
        // TODO Auto-generated method stub
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

 

반응형