SpringBoot中websocket拦截器获取cookie中的token信息


@Getter
@Slf4j
@Component
public class WebSocketSecurityTokenInterceptor implements HandshakeInterceptor {

    private TokenAcquireHandler tokenAcquireHandler;

    private TokenAnalysisHandler tokenAnalysisHandler;

    {
        tokenAcquireHandler = SpringUtil.getOrDefault( TokenAcquireHandler.class, new DefaultTokenAcquireHandler() );
        tokenAnalysisHandler = SpringUtil.getOrDefault( TokenAnalysisHandler.class, new DefaultTokenAnalysisHandler() );
    }

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {
        //  放开的路径直接放行
        if ( FilterContextHandler.getContext().isExclude() ) {
            //  如果已经手动setContext 此处不再赋值Empty
            if ( SecurityContextHandler.getContext() == null ) {
                SecurityContextHandler.setContext( SecurityContext.EMPTY );
            }
            return true;
        }
        String token = getToken(request);
        if ( !StringUtils.hasText( token ) ) {
            throw new TokenNotFoundException( "token not found" );
        }
        // ...业务逻辑
        return true;
    }

    /**
     * 校验用户信息
     */
    private void checkUserDetails( String token, UserDetails userDetails ) {
        //...
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
        // 握手完成后进行一些初始化工作
        //log.info("握手完成......");
    }

    private String getToken( ServerHttpRequest req ) {
        List< String > cookies = req.getHeaders().get( HttpHeaders.COOKIE );
        for (String cookieStr : Optional.ofNullable(cookies).orElse(Collections.emptyList())) {
            HttpCookie cookie = parseAuthCookie(cookieStr);
            if ( cookie != null ){
                return cookie.getValue();
            }
        }
        return null;
    }

    private HttpCookie parseAuthCookie(String cookieStr) {
        if (!StringUtils.hasText(cookieStr)){
            return null;
        }
        List cookieList = Arrays.stream(cookieStr.split(";")).map(this::parseCookie).filter(Objects::nonNull).collect(Collectors.toList());
        for (HttpCookie cookie : cookieList) {
            if ( HttpHeaders.AUTHORIZATION.equals( cookie.getName() ) ) {
                return cookie;
            }
        }
        return null;
    }

    private HttpCookie parseCookie(String cookieStr) {
        try {
            List cookies = HttpCookie.parse(cookieStr);
            return CollectionUtils.isEmpty(cookies) ? null : cookies.get(0);
        }catch (Exception e){
            return null;
        }
    }

}

你可能感兴趣的:(spring,boot,websocket,java)