Custom Captive Portal: Guia de HTML e CSS
Este guia de referência técnica definitivo descreve os padrões de desenvolvimento, a arquitetura CSS e as restrições em nível de rede necessárias para projetar e codificar uma landing page de Captive Portal personalizada. Ele fornece a desenvolvedores frontend e arquitetos de rede estratégias acionáveis para navegar pelos ambientes Apple CNA e webview do Android, garantindo experiências de WiFi de visitantes pixel-perfect, em conformidade e de alto desempenho.
Ouça este guia
Ver transcrição do podcast
📚 Parte da nossa série principal: O Guia Definitivo de Captive Portals →
- Executive Summary
- Technical Deep-Dive
- The Captive Portal Lifecycle
- Platform-Specific Mini-Browser Constraints
- Coding Around the Apple CNA "Done" Button Trap
- Implementation Guide
- The Golden Rule: Design for Zero Internet Connectivity
- 1. Viewport Configuration
- 2. Inlining CSS and Removing External Dependencies

Executive Summary
For enterprise venues—ranging from luxury hotels Hospitality and retail chains Retail to transit hubs Transport and modern medical campuses Healthcare —the guest WiFi splash page is the digital front door. However, over 90% of guest WiFi logins occur on mobile devices, where rendering is governed not by standard browsers like Safari or Chrome, but by highly restricted Captive Network Assistant (CNA) webviews [1]. These "mini-browsers" enforce severe sandbox limitations: they block external CDNs, disable persistent cookies, ignore external web fonts, and severely restrict JavaScript execution to mitigate security risks and prevent session hijacking [2].
When a developer designs a splash page using traditional web standards, these constraints result in broken layouts, missing brand assets, and non-functional login buttons, directly impacting customer satisfaction and digital engagement. This guide provides solutions to these challenges, presenting defensive coding practices—such as inline CSS, Base64 asset encoding, system font stacks, and explicit navigation-driven authentication handshakes—to ensure seamless cross-platform rendering. Furthermore, we examine how utilising a managed solution like Purple's portal builder allows developers to maintain complete HTML/CSS creative control while offloading RADIUS authentication, database scaling, GDPR/PCI compliance, and multi-vendor AP integrations [3].
Technical Deep-Dive
To build a resilient custom captive portal, developers must understand the network-level interception and browser virtualisation that occurs when a guest associates with an open Service Set Identifier (SSID).
The Captive Portal Lifecycle
When a client device associates with a captive SSID, the following sequence is triggered:
- IP Association: The device completes a 3-way handshake and requests an IP address via DHCP.
- Active Connectivity Probe: The operating system's background network manager immediately sends an HTTP GET request to a dedicated vendor-neutral canary URL (e.g., Apple's
http://captive.apple.com/hotspot-detect.htmlor Google'shttp://connectivitycheck.gstatic.com/generate_204) [1]. - DNS/HTTP Interception: The local Wireless LAN Controller (WLC) or Access Point (AP) intercepts this port 80 HTTP request. Instead of returning the expected HTTP 200 or 204 status, the gateway redirects the client's traffic to the captive portal's landing page URL via an HTTP 302 redirect [2].
- Webview Spawning: Detecting the redirect, the OS spawns its native Captive Network Assistant (CNA) mini-browser to display the redirected splash page, bypassing the need for the user to manually open a full browser.
- Authentication and State Transition: The user completes the login form, submitting credentials back to the portal server, which instructs the gateway (often via a RADIUS Access-Accept or external API call) to authorise the MAC address.
- CNA Exit Handshake: The CNA mini-browser performs another HTTP GET to its canary URL. If it receives the expected 200/204 response, it changes its top-right button from "Cancel" to "Done" and establishes the WiFi connection as the primary network interface.
Platform-Specific Mini-Browser Constraints
Each operating system handles this lifecycle within different webview environments, resulting in highly fragmented behaviour. The table below details these critical constraints:
| Platform / Webview | Display Method | Persistent Cookies | External Web Fonts | JavaScript Execution | Window Dimensions | Exit Handshake Trigger |
|---|---|---|---|---|---|---|
| Apple iOS CNA (Websheet) | Mini-Browser Popup | Blocked (Destroyed on close) | Blocked (Offline) | Limited (No localStorage/sessionStorage) | Responsive (Device-width) | Full-page HTTP Redirect Only [1] |
| Apple macOS CNA (Captive Network Assistant) | Mini-Browser Popup | Blocked | Blocked | Limited (No alert/confirm dialogs) | Fixed (900px x 572px) | Full-page HTTP Redirect Only |
| Android (Google) (CaptivePortalLogin) | Push Notification -> Chrome Custom Tab | Allowed (Shared with Chrome) | Allowed (If whitelisted in walled garden) | Full | Responsive | Automatic (Captive Portal API / 204 Check) [2] |
| Samsung Android (Samsung Internet) | Push Notification -> Mini-Browser | Allowed | Allowed | Full | Responsive | Automatic |
| Windows 10/11 (Default Browser) | Auto-Launch Default Browser | Allowed (Full browser context) | Allowed | Full | Responsive | Manual / Automatic |

Coding Around the Apple CNA "Done" Button Trap
One of the most frequent failure modes in custom portal development is the "Done" Button Trap on iOS devices. When a user authenticates, the iOS Websheet webview must detect that the network is no longer captive. It does this by monitoring the success of its background canary requests.
Crucially, the iOS CNA will only trigger this check upon a full-page HTTP navigation (location redirect). If a developer builds a modern Single Page Application (SPA) that submits form data via an asynchronous AJAX call (e.g., fetch() or Axios) and updates the DOM dynamically without changing the URL, the CNA will never re-run its connectivity check. The user will be authenticated at the gateway level, but the CNA button in the top-right corner will remain as "Cancel". If the frustrated user clicks "Cancel", the iOS device will immediately disassociate from the SSID, terminating the WiFi session [1].
To prevent this, the authentication success handler must perform a full-page redirect to a physical landing page (e.g., window.location.href = '/success') or submit the login form natively via a standard HTTP POST action.
Implementation Guide
To ensure consistent rendering across all platforms, developers must transition from modern, asset-heavy web design to a highly self-contained, defensive coding style.
The Golden Rule: Design for Zero Internet Connectivity
During the captive state, the client device has no access to the wider internet. It can only resolve and access IP addresses and domains explicitly whitelisted in the wireless controller's Walled Garden (such as the IP of the captive portal server itself). Therefore, any external asset referenced in your HTML will fail to load, resulting in a broken layout.
To design defensively, implement the following Mobile-First Captive Portal Design Checklist:

1. Viewport Configuration
To prevent mobile devices from scaling down the viewport to a desktop width (typically 980px), the HTML `` must include a responsive viewport meta tag. Without this, text and input fields will appear microscopic on mobile devices:
2. Inlining CSS and Removing External Dependencies
Never link to external CSS files or CDNs (e.g., Bootstrap, Tailwind, or Google Fonts). All CSS must be embedded within a `
<div class="portal-card">
<div class="logo-container">
YOUR BRAND
</div>
<h1>Welcome to Guest WiFi</h1>
<p>Please enter your details below to gain secure, high-speed internet access.</p>
<div class="form-group">
Full Name
</div>
<div class="form-group">
Email Address
</div>
<div class="consent-group">
I accept the <a href="#">Terms of Service</a> and consent to data processing in compliance with GDPR regulations.
</div>
<div id="terms_box" class="terms-scrollbox">
<strong>WiFi Terms of Service:</strong><br />
1. This service is provided as-is without warranties.<br />
2. Users must not engage in illegal bandwidth-intensive activities.<br />
3. Personal data is collected solely for authentication and marketing opt-ins in compliance with our Privacy Policy.
</div>
Connect to WiFi
<div class="footer">
Powered by Purple | Secure Guest WiFi
</div>
</div>
## Troubleshooting & Risk Mitigation
When deploying custom-coded HTML/CSS captive portals, IT operations teams frequently encounter several severe operational risks:
### 1. The SSL/TLS Certificate Warning Loop
Because captive portals function by intercepting traffic, they present a fundamental conflict with modern HTTPS web security. When a user attempts to visit an HTTPS site (e.g., `https://www.google.com`), and the gateway attempts to redirect that traffic to an HTTP captive portal, the browser detects a mismatch in the SSL certificate and displays a critical "Your connection is not private" security warning.
* **Mitigation**: Never attempt to intercept HTTPS traffic directly. Rely entirely on the operating system's native CNA helper (which makes an unencrypted HTTP request to trigger the redirect). Ensure your captive portal's domain has a valid, publicly trusted SSL certificate (e.g., Let's Encrypt or DigiCert) and is served over HTTPS *only after* the initial HTTP redirect has successfully routed the user to your portal domain [2].
### 2. DNS Resolution Failures (The Walled Garden Trap)
If your custom HTML page references external resources—such as a social login OAuth endpoint (e.g., Facebook, Google) or a payment gateway—the DNS requests for these domains will fail unless they are explicitly whitelisted in the wireless controller's Walled Garden. If a domain is missing from the whitelist, the login flow will stall, presenting a blank screen.
* **Mitigation**: Maintain a strict, minimal Walled Garden list. If utilising social logins, whitelist the specific wildcard domains recommended by the identity providers (e.g., `*.google.com`, `*.gstatic.com`).
### 3. Session Timeout and MAC Spoofing Vulnerabilities
Standard captive portals authenticate devices based on their MAC addresses. However, modern mobile operating systems (iOS 14+ and Android 10+) utilise randomised MAC addresses (private WiFi addresses) by default, rotating them periodically. This can lead to guests being repeatedly prompted to re-authenticate, destroying the user experience [1].
* **Mitigation**: Implement reasonable session timeouts (e.g., 24 hours) on the RADIUS server to prevent stale sessions, and utilise modern authentication standards like **Passpoint (Hotspot 2.0)** or **WPA3-Enterprise** for seamless, secure onboarding that bypasses MAC-based captive portals entirely.
## Purple Product Relevance: Build vs. Buy
While coding a single HTML page is straightforward, hosting, securing, and scaling a custom captive portal infrastructure presents massive technical and compliance hurdles. The table below compares the engineering and operational realities of self-hosting a custom portal versus utilising Purple's managed enterprise platform:
| Feature / Operational Requirement | Self-Hosted Custom Portal | Purple Enterprise WiFi Platform |
| :--- | :--- | :--- |
| **HTML/CSS Customisation** | Fully manual coding, uploading files to individual APs or local web servers. | **Pixel-perfect developer editor** allowing custom HTML/CSS injects, combined with a drag-and-drop visual builder.
| **RADIUS Infrastructure** | Must deploy, configure, and maintain highly available FreeRADIUS or Cloud RADIUS servers [4]. | **Built-in, globally distributed, cloud-native RADIUS** with active-active redundancy and 99.99% uptime SLAs.
| **Multi-Vendor AP Support** | Custom integration scripts required for each hardware vendor (Cisco, Aruba, Meraki, Ruckus) [5]. | **Native, out-of-the-box integration** with over 200 hardware models; unified portal deployment across mixed-hardware estates.
| **Data Privacy & Compliance** | Venue assumes 100% legal liability for GDPR, CCPA, and PCI DSS compliance, including secure database encryption and data deletion workflows. | **Fully compliant by design**. Built-in consent management, automated data-subject deletion requests, and secure ISO 27001-certified hosting.
| **Analytics & Marketing** | Requires building custom data ingestion pipelines and integrating third-party marketing tools. | **Enterprise-grade analytics dashboard** with real-time footfall tracking, return-rate metrics, and automated marketing campaign triggers [6].
| **Identity Provider Integrations** | Manual OAuth2 integrations with Google, Facebook, Apple, and local SMS gateways. | **One-click integrations** with major social platforms, SMS gateways, and Azure AD / Okta for corporate guests.
Purple's platform resolves the "Build vs. Buy" dilemma. It provides developers with the complete creative freedom of a custom HTML/CSS workspace while eliminating the complex, high-risk backend infrastructure engineering required to support secure RADIUS authentication at scale.
## ROI & Business Impact
Investing in a professionally engineered, responsive custom captive portal delivers quantifiable returns across IT operations, marketing, and legal compliance.
### 1. Operational Cost Reduction (IT Helpdesk Tickets)
In large-scale deployments, such as a stadium or multi-site retail chain, a broken captive portal is a leading driver of IT helpdesk escalations. When guests encounter a "white screen" or a non-responsive login button, they overwhelm on-site staff or submit support tickets.
$$\text{Annual Support Savings} = (\text{Total Annual Guest Visits} \times \text{Portal Failure Rate} \times \text{Helpdesk Contact Rate}) \times \text{Cost Per Support Ticket}$$
* **Scenario**: A convention centre with 1,000,000 annual visitors. A poorly coded portal has a 5% failure rate on older iOS devices, leading to a 10% helpdesk contact rate. At an industry-standard $15 per support ticket, the operational cost is:
$$(1,000,000 \times 0.05 \times 0.10) \times \$15 = \$75,000 \text{ annually in avoidable support overhead}$$
* **Outcome**: Transitioning to a CNA-optimised, mobile-first template reduces the portal failure rate to <0.1%, virtually eliminating this operational drain.
### 2. Marketing Data Capture and Opt-in Optimisation
For retail and hospitality venues, the guest WiFi portal is the primary mechanism for capturing clean, first-party customer data. A poorly designed user interface with microscopic text or a clunky form layout causes high **bounce rates**—users abandon the login process entirely, resulting in lost marketing opportunities.
* **Case Study (Retail)**: A national retail chain implemented a mobile-first optimised captive portal utilising Purple's platform. By replacing a multi-step login form with a single-field email input (font-size: 16px) and an optimised 48px tap-target button, they saw a **42% increase in completed registrations** and a **28% increase in marketing newsletter opt-ins** within the first quarter [6].
### 3. Legal and Regulatory Risk Mitigation
Under GDPR and CCPA, non-compliant data collection carries severe financial penalties (up to 4% of global annual turnover under GDPR). Relying on pre-ticked checkboxes or failing to provide a clear, easily accessible Privacy Policy on your splash page exposes the enterprise to immense legal liability.
* **Mitigation ROI**: Implementing an explicit, un-ticked consent checkbox and hosting terms within an optimised scrollbox ensures 100% regulatory compliance, mitigating the risk of multi-million dollar regulatory fines and protecting brand reputation.
## Summary of Key Takeaways
* **The CNA Sandbox is Restrictive**: Apple's iOS Websheet and macOS CNA are highly sandboxed environments that block external assets, cookies, and web fonts. All styling and assets must be self-contained (inline CSS, Base64 images, system fonts) [1].
* **AJAX Breaks the iOS Exit Handshake**: To successfully transition the iOS device from "captive" to "connected" (changing the top-right button from "Cancel" to "Done"), you must trigger a full-page HTTP redirect. Asynchronous DOM updates will leave the device in a captive loop.
* **Mobile-First is Mandatory**: Over 90% of logins occur on mobile. Design a single-column layout (max-width: 480px), utilise touch-friendly tap targets (minimum 44px x 44px), and enforce a minimum 16px font size on all text inputs to prevent automatic iOS browser zooming.
* **Walled Gardens Control DNS**: Any external domain referenced during login (e.g., social login APIs) must be explicitly whitelisted in the wireless controller's walled garden, or the page will fail to load.
* **Purple Eliminates Backend Complexity**: Utilising Purple's portal builder gives developers complete HTML/CSS control via a custom editor, while offloading the immense security, scaling, and compliance burdens of RADIUS, multi-vendor AP integrations, and GDPR-compliant database management [3].
## References
* [1] [Wireless Broadband Alliance: Captive Network Portal Behaviour](https://captivebehavior.wballiance.com/)
* [2] [Android Open Source Project: Captive Portal Login Webview Integration](https://source.android.com/docs/core/connect/android-custom-tabs-captive-portal)
* [3] [European Data Protection Board: Guidelines on Consent under Regulation 2016/679](https://edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en)
* [4] [How to Implement 802.1X Authentication with Cloud RADIUS](/guides/implementing-8021x-with-cloud-radius)
* [5] [Cisco Wireless APs: 2026 Guide to Products & Deployment](/blog/cisco-wireless-ap)
* [6] [Purple WiFi Marketing & Analytics Platform](/guest-wifi-marketing-analytics-platform)
---
## Listen to the Technical Briefing
Listen to a senior solutions architect discuss the technical constraints and implementation strategies for custom captive portals:
Definições principais
Captive Portal
Uma página da web que é exibida para usuários recém-conectados de uma rede Wi-Fi antes que lhes seja concedido acesso mais amplo aos recursos da rede, normalmente usada para autenticação, pagamento ou exibição de termos de serviço.
As equipes de TI implantam Captive Portals no nível do gateway para controlar o acesso de visitantes, capturar dados do usuário e garantir a conformidade legal.
Captive Network Assistant (CNA)
Um mini-navegador altamente restrito e em sandbox gerado automaticamente pelos sistemas operacionais (como Apple iOS e macOS) ao detectar um redirecionamento de rede cativa, projetado exclusivamente para facilitar a autenticação no portal.
As webviews do CNA impõem limitações estritas, incluindo o bloqueio de CDNs externas, cookies persistentes e armazenamento local, o que frequentemente quebra designs de web padrão.
Walled Garden
Uma lista restrita de endereços IP, sub-redes ou nomes de domínio que um usuário visitante não autenticado tem permissão para acessar através do gateway antes de concluir o processo de login do Captive Portal.
Os desenvolvedores devem garantir que qualquer recurso externo (como APIs de login social ou gateways de pagamento) esteja na lista de permissões (whitelist) do walled garden para evitar que o fluxo de login seja interrompido.
Base64 Encoding
Um esquema de codificação binário para texto que representa dados binários (como imagens) como uma string ASCII, permitindo que os ativos sejam incorporados diretamente em documentos HTML ou CSS.
A utilização da codificação Base64 para logotipos e ícones elimina solicitações HTTP externas, garantindo que os ativos sejam renderizados perfeitamente em ambientes CNA offline.
RADIUS (Remote Authentication Dial-In User Service)
Um protocolo de rede que fornece gerenciamento centralizado de Autenticação, Autorização e Contabilização (AAA) para usuários que se conectam e usam um serviço de rede.
O servidor do Captive Portal se comunica com um servidor RADIUS para autorizar o endereço MAC do visitante no gateway de rede assim que os critérios de autenticação forem atendidos.
System Font Stack
Uma declaração CSS font-family que prioriza fontes de sistema operacional pré-instaladas (como San Francisco no iOS, Segoe UI no Windows e Roboto no Android) em detrimento de fontes web externas.
A implementação de uma pilha de fontes do sistema garante a renderização imediata da tipografia sem acionar solicitações HTTP externas bloqueadas para serviços como o Google Fonts.
Canary URL
Uma URL HTTP dedicada e não criptografada mantida por fornecedores de sistemas operacionais (por exemplo, captive.apple.com) para testar se um dispositivo possui conectividade irrestrita com a internet.
O gerenciador de rede em segundo plano do SO verifica esta URL para detectar a presença de um Captive Portal e acionar o pop-up da webview do CNA.
Passpoint (Hotspot 2.0)
Um padrão da indústria desenvolvido pela Wi-Fi Alliance que permite que dispositivos móveis descubram e se autentiquem com segurança de forma automática em hotspots Wi-Fi, ignorando logins manuais de Captive Portal.
As empresas utilizam o Passpoint juntamente com plataformas como a Purple para fazer a transição dos visitantes de splash pages com muito atrito para experiências de roaming seguras e contínuas, semelhantes às de redes celulares.
Exemplos práticos
Uma rede de hotéis de luxo de 250 quartos [Hospitality](/industries/hospitality) deseja implementar uma página de login de WiFi de visitantes personalizada que corresponda perfeitamente às diretrizes de sua marca premium. Sua agência criativa projetou uma splash page utilizando tipografia de marca personalizada (hospedada no Adobe Fonts), várias imagens de fundo de alta resolução (hospedadas em um bucket público do AWS S3) e um assistente animado em JavaScript de várias etapas. Quando implantado, os visitantes com iOS se conectam ao SSID, mas o portal aparece como uma tela branca em branco e os usuários não conseguem se autenticar.
Para resolver a tela em branco e a identidade visual quebrada, devemos reestruturar a arquitetura de frontend do portal para cumprir as restrições de sandbox do Apple CNA:
- Correção de Tipografia: Como o Adobe Fonts requer uma solicitação HTTP externa que é bloqueada pelo CNA, substituímos a chamada de fonte personalizada por uma pilha de fontes de sistema nativa e premium (
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;). Isso garante a renderização instantânea sem chamadas de rede externas. - Otimização de Ativos: As imagens de fundo no AWS S3 são bloqueadas porque o S3 não está no walled garden do gateway. Comprimimos o logotipo principal da marca, o convertemos em um SVG leve e o codificamos diretamente no HTML como uma Base64 Data URI. Para o fundo, substituímos as imagens pesadas por um gradiente CSS limpo e responsivo usando as cores da marca do hotel, reduzindo significativamente o peso da página.
- Simplificação de JavaScript: O assistente animado de várias etapas depende de bibliotecas externas jQuery e GSAP. Removemos essas dependências externas e refatoramos o formulário em uma estrutura HTML de coluna única e página única. A validação do formulário é reescrita em JavaScript vanilla leve.
- Handshake de Autenticação: O envio do formulário é modificado de um envio baseado em AJAX para um
<form action="/submit" method="POST">HTML nativo para acionar um redirecionamento de página inteira, permitindo que o Websheet do iOS execute sua verificação canário e exiba o botão 'Done'.
Uma rede nacional de varejo [Retail](/industries/retail) com 450 lojas deseja capturar e-mails de visitantes por meio de splash pages de WiFi para alimentar seu CRM. Eles exigem que os visitantes optem por receber newsletters de marketing. O design inicial tem uma caixa de seleção pré-marcada 'Concordo em receber e-mails de marketing'. Além disso, o portal está hospedado em um único servidor local em sua sede. Durante os horários de pico (tarde de sábado), os visitantes de todo o país enfrentam atrasos graves e muitos não conseguem carregar a página de login, levando a uma queda massiva nas taxas de captura de dados.
Devemos abordar tanto a violação de conformidade quanto o gargalo de infraestrutura:
- Correção de Conformidade: Sob o GDPR e a CCPA, caixas de consentimento pré-marcadas são ilegais. Modificamos o HTML para tornar a caixa de seleção de consentimento de marketing desmarcada por padrão (
<input type="checkbox" id="marketing_consent">). Também adicionamos uma caixa de seleção separada e obrigatória para os Termos de Serviço para desvincular o acordo legal da opção de marketing. - Escalonamento de Infraestrutura: Hospedar um Captive Portal nacional em um único servidor centralizado cria um ponto único de falha e um enorme gargalo de latência. Migramos o frontend do portal para uma Rede de Distribuição de Conteúdo (CDN) altamente disponível e distribuída globalmente com cache de borda.
- Integração RADIUS: Configuramos os pontos de acesso das lojas locais para apontar para um cluster RADIUS nativo da nuvem com redundância ativo-ativo, garantindo que as solicitações de autenticação sejam processadas localmente na borda com latência inferior a 50 ms, mesmo durante o tráfego de pico de sábado.
- Migração para a Purple: Para eliminar todo esse custo de engenharia, o varejista migra para a Purple. As ferramentas integradas de consentimento de GDPR da Purple gerenciam automaticamente as adesões em conformidade, e sua infraestrutura de nuvem distribuída globalmente lida com milhões de autenticações diárias com 99,99% de tempo de atividade, resolvendo completamente o gargalo de escalonamento.
Questões práticas
Q1. Uma equipe de TI em um grande aeroporto internacional [Transport](/industries/transport) implanta um Captive Portal codificado de forma personalizada. Eles percebem que, embora os usuários do Android se conectem perfeitamente, uma parte significativa dos usuários do iOS enfrenta um problema em que se autenticam com sucesso, mas não conseguem navegar na web. Em uma inspeção mais detalhada, os dispositivos iOS mostram que estão conectados ao SSID, mas o botão superior direito no pop-up cativo ainda diz 'Cancel' em vez de 'Done'. Qual é a causa raiz desse problema e como o desenvolvedor deve corrigi-lo?
Dica: Analise como o assistente do Apple CNA detecta que uma rede passou de cativa para autenticada e qual ação do navegador é necessária para acionar essa verificação.
Ver resposta modelo
A causa raiz é que a página de sucesso do portal está atualizando a interface do usuário dinamicamente via JavaScript (roteamento AJAX/SPA) em vez de realizar uma navegação HTTP de página inteira. O mini-navegador Captive Network Assistant (CNA) do Apple iOS apenas executa novamente sua verificação de conectividade em segundo plano (a solicitação canário para captive.apple.com) quando ocorre um redirecionamento ou navegação de URL de página inteira. Se o desenvolvedor enviar o formulário de login via AJAX e simplesmente exibir uma mensagem de 'Sucesso' no DOM, o CNA permanecerá sem saber que a rede foi desbloqueada. Consequentemente, o botão superior direito permanece como 'Cancel'. Se o usuário clicar em 'Cancel' para sair, o SO assumirá que o login falhou e se desconectará da rede WiFi.
Solução: O desenvolvedor deve modificar o manipulador de sucesso de autenticação para forçar um redirecionamento de página inteira. Isso pode ser alcançado enviando o formulário de login nativamente por meio de um <form action="/submit" method="POST"> HTML padrão ou executando window.location.href = '/success_landing_page' em JavaScript assim que a API retornar uma resposta de autenticação bem-sucedida. Isso aciona o carregamento de página inteira necessário, forçando o assistente do CNA a reavaliar o estado da rede, verificar se a URL canário agora está acessível e alterar o botão superior direito para 'Done'.
Q2. Uma equipe de operações de estádio [Events] deseja lançar uma rede WiFi de visitantes que capture adesões de marketing. O oficial de conformidade insiste que o portal deve ser 100% compatível com o GDPR. A equipe de desenvolvimento apresenta um mockup onde o formulário de login tem uma caixa pré-marcada dizendo 'Concordo com os Termos de Serviço e dou consentimento para receber newsletters de marketing'. Por que esse design não está em conformidade e como a estrutura do formulário e do HTML/CSS deve ser refatorada para atender ao GDPR e, ao mesmo tempo, manter uma alta taxa de conversão?
Dica: Considere os requisitos estritos do GDPR em relação ao consentimento explícito, a desvinculação das opções de marketing dos termos de serviço e a visibilidade física do texto legal em telas móveis.
Ver resposta modelo
O design proposto viola o GDPR em duas frentes principais: primeiro, caixas de seleção pré-marcadas não constituem consentimento válido, que deve ser dado livremente, específico, informado e inequívoco. Segundo, agrupar o consentimento de marketing com o acordo dos Termos de Serviço não está em conformidade; um usuário não pode ser forçado a aceitar e-mails de marketing como condição para usar o serviço de WiFi.
Estratégia de Refatoração:
- Desvincular o Consentimento: Divida a caixa de seleção em duas caixas de seleção separadas. A Caixa de Seleção A é obrigatória e cobre os Termos de Serviço e a Política de Privacidade. A Caixa de Seleção B é opcional e cobre a adesão à newsletter de marketing.
- Definir como Desmarcada: Certifique-se de que ambas as caixas de seleção estejam desmarcadas por padrão no HTML (atributo
checkedomitido). - Visibilidade do CSS: Como mais de 90% dos usuários estão no celular, coloque as caixas de seleção diretamente acima do botão 'Conectar' para que fiquem visíveis 'above the fold' (acima da dobra) sem rolar. Use uma pilha de fontes do sistema e defina o tamanho da fonte do rótulo para 14px com uma altura de linha de 1.4 para facilitar a leitura.
- Caixa de Rolagem dos Termos: Para evitar que o texto legal empurre os elementos do formulário para fora da tela, coloque os Termos de Serviço detalhados em um contêiner rolável com altura fixa (
max-height: 100px; overflow-y: auto; background-color: #F5F1ED; border: 1px solid #D1D5DB; border-radius: 6px;) que pode ser aberto ou fechado por meio de um link de texto. Isso mantém um layout limpo e de alta conversão, garantindo conformidade legal absoluta.
Q3. Uma rede de varejo [Retail](/industries/retail) está implantando uma splash page codificada de forma personalizada em 100 lojas. O designer usou o Google Fonts (Montserrat) e vinculou a uma folha de estilo Bootstrap hospedada em CDN no cabeçalho HTML. Durante os testes em uma rede corporativa, a página é renderizada perfeitamente. No entanto, quando implantada em um AP de teste de loja com uma configuração de rede cativa, a página é renderizada com texto Times New Roman sem estilo, alinhamento quebrado e ícones ausentes. Por que isso acontece e como os ativos devem ser refatorados?
Dica: Analise o estado da conexão de rede antes que um usuário seja autenticado e determine como o navegador lida com solicitações HTTP externas para domínios fora do walled garden.
Ver resposta modelo
Essa falha ocorre porque o dispositivo está em um estado cativo e não autenticado quando a splash page é carregada. Nesse estado, o gateway sem fio bloqueia todo o tráfego de internet de saída, permitindo solicitações apenas para domínios explicitamente incluídos na lista de permissões (whitelist) no Walled Garden do gateway. Como os domínios de CDN para o Bootstrap (cdn.jsdelivr.net) e Google Fonts (fonts.googleapis.com) não estão na lista de permissões, as solicitações do navegador para buscar a folha de estilo e os arquivos de fonte falham silenciosamente. Consequentemente, o navegador recorre ao seu mecanismo de renderização padrão, resultando em HTML sem estilo (texto Times New Roman) e layouts quebrados.
Estratégia de Refatoração:
- CSS Inline: Remova o link externo da folha de estilo do Bootstrap. Copie as regras necessárias de CSS grid/flexbox diretamente em um bloco
<style>no<head>do HTML. Isso garante que todas as instruções de layout sejam entregues no payload inicial de página única. - Implementar Pilha de Fontes do Sistema: Remova a chamada
@importou<link>do Google Fonts. Substitua-a por uma pilha de fontes de sistema nativa no CSS (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;). Isso força o dispositivo a usar fontes de alta qualidade já pré-instaladas no sistema operacional, eliminando totalmente a dependência de rede externa. - Codificar Ícones/Logotipos em Base64: Se o layout depender de imagens externas ou bibliotecas de ícones (como FontAwesome), converta esses ícones para o formato SVG e incorpore-os inline no HTML ou como Base64 Data URIs no CSS. Isso garante que a página seja 100% independente e seja renderizada perfeitamente, mesmo com zero conectividade com a internet.
Continue a ler esta série
Projetando Captive Portals B2B: Coletando Nome Registrado e Dados da Empresa
Este guia fornece aos gerentes de TI e operadores de locais uma estrutura técnica neutra em relação a fornecedores para projetar Captive Portals B2B. Ele detalha como estruturar campos de registro para capturar dados de nome registrado e empresa, garantindo altas taxas de conclusão enquanto mantém a conformidade com o GDPR e constrói inteligência no nível da conta.
Arquitetura de Captive Portal: Segurança, Redirecionamento e Melhores Práticas
Uma referência técnica definitiva sobre a arquitetura de captive portal corporativo. Este guia detalha o isolamento de rede, redirecionamento de DNS, autenticação RADIUS e conformidade de segurança para líderes de TI que implantam redes WiFi de visitantes seguras e ricas em dados.
Otimizando Captive Portals B2B: Capturando Nomes de Empresas e Dados Profissionais
Este guia explica como gerentes de TI, arquitetos de rede e diretores de operações de locais podem configurar Captive Portals B2B para capturar dados profissionais - nomes de empresas, cargos e endereços de e-mail comercial - no momento do login no WiFi. Ele abrange toda a arquitetura técnica, desde o isolamento de VLAN e autenticação RADIUS até a integração de CRM com Salesforce e HubSpot, com conformidade com GDPR e CCPA integrada. Os locais que implantam isso corretamente transformam sua rede WiFi de convidados em um mecanismo de dados proprietários e em um sistema automatizado de geração de leads.