O arquivo proxy-config.xml define a política pela qual os pedidos de URI são suportados para serem transmitidos por meio do proxy e como os caminhos de contexto a partir do cliente são mapeados para o URI em um servidor.
É possível modificar o arquivo proxy-config.xml com um editor de texto. Salve esse arquivo em um local no caminho de classe que o servlet do proxy possa localizar. As alterações no arquivo proxy-config.xml não são dinâmicas; reinicie o servlet para que as alterações sejam efetivadas.
Considere um arquivo archive corporativo (EAR) do JavaTM Platform, Enterprise Edition (Java EE) que contém seu aplicativo baseado em Ajax. Você está utilizando o kit de ferramentas do Dojo para combinar um conteúdo que se origina de um outro servidor e fornece informações sobre locais de cafeterias. O formato de dados é retornado a partir de outro servidor como dados JavaScriptTM Object Notation (JSON). Combine os dados JSON retornados com o aplicativo baseado no Ajax que você está desenvolvendo, que é geralmente chamado de mashup do lado do cliente.
Digite as seguintes linhas de código:
GET http://www.myinformation.com/location/coffee HTTP/1.1O seguinte conteúdo JSON é retornado:
{ "locations":{ "location":[ { "id":"Exemplo Jumpin Joes", "city":"Qualquer lugar", "location":"Weston Pkwy", "address":"126 Weston Pkwy, Anywhere, NC 27513", "date":"2 de maio de 2008" }, { "id":"Exemplo Café & Crepes", "city":"Qualquer lugar", "location":"Crossroads Blvd", "address":"123 Crossroads Blvd, Anywhere, NC 27518", "date":"3 de maio de 2008" } ] } }
Utilizando o proxy do Ajax, você pode disponibilizar o serviço incluindo as seguintes linhas de código em seu arquivo proxy-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/websphere/featurepack/v6.1/proxy-config" xsi:noNamespaceSchemaLocation="C:\temp\proxy-config.xsd"> <proxy:mapping contextpath="/location/coffee" url="http://www.myinformation.com"/> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
O contextpath acima é a raiz de contexto do serviço que está sendo acessado. A URL é a URL raiz para o serviço. Como exemplo, você poderia acessar o serviço diretamente em um navegador utilizando http://www.myinformation.com/location/coffee
O caminho para acessar o proxy em seu código depende de como o proxy do Ajax foi implementado. Considere o fragmento de XML de um web.xml que pode ser utilizado para o proxy do Ajax:
<servlet-mapping> <servlet-name>ProxyServlet</servlet-name> <url-pattern>/proxymashup/*</url-pattern> </servlet-mapping>
var deferred = dojo.xhrGet( { url: "/proxy/proxymashup/location/coffee", timeout: 5000, handleAs : "text/json", headers: { "Content-Type":"text/html" }, } );
Os esquemas XML para o arquivo proxy-config.xml estão localizados no diretório WEB-INF/ para o arquivoAjaxProxy.war. Os dois esquemas são proxy-config_1.0.1.xsd e proxy-config_1.0.xsd. O proxy-config_1.0.1.xsd corresponde à versão 1.0.1 e contém novos recursos como Filtragem de IP. Os usuários podem continuar usando versões do proxy-config.xml que correspondem ao proxy-config_1.0.xsd.
<proxy:policy url="*" acf="none"> . . <proxy:mime-types> <proxy:mime-type>text/json</proxy:mime-type> </proxy:mime-types> . . </proxy:policy>
Se o serviço retornou text/html, o proxy responderá retornando uma condição de erro para o cliente, uma vez que o text/html não está listado como um tipo de conteúdo aceitável no servidor. Se o <proxy:mime-types> não for especificado, o comportamento será permitir todos os tipos de conteúdo.
Para controlar o fluxo de cookies, defina o nome de cookie permitido no arquivo proxy-config.xml. O exemplo a seguir mostra como você pode configurar o proxy para transmitir apenas os cookies que possuem o nome de chave de cookie Session-Cookie-0.
<proxy:policy url="*" acf="none"> . . <proxy:cookies> <proxy:cookie>Session-Cookie-0</proxy:cookie> </proxy:cookies> . . </proxy:policy>
<proxy:policy url="*" acf="none"> . . <proxy:headers> <proxy:header>User-Agent</proxy:header> <proxy:header>Accept*</proxy:header> <proxy:header>Content*</proxy:header> <proxy:header>Authorization*</proxy:header> <proxy:header>My-New-Header</proxy:header> <proxy:header>My-Other-New-Header</proxy:header> </proxy:headers> . . </proxy:policy>
Vários serviços podem precisar de uma conexão de soquete seguro que utilize SSL. Como um aplicativo da Web, o proxy Ajax alavanca o JavaTM Secure Socket Extension (JSSE) e é completamente suportado pelo produto. Consulte a documentação do WebSphere® correspondente sobre o suporte ao certificado SSL.
<proxy-meta-data> <proxy:name>unsigned_ssl_certificate_support</proxy:name> <proxy:value>true</proxy:value> </proxy-meta-data>
Quando unsigned_ssl_certificate_support é designado, o proxy Ajax aceita qualquer certificado SSL. Na prática, essa configuração é usada para desenvolvimento e não deve ser usada em um ambiente de produção.
O proxy Ajax pode ser ajustado com um número de parâmetros.
O maxconnectionperhost é um valor global que especifica o número máximo de conexões mantidas ativas para qualquer combinação de host ou de porta. Por padrão, o valor é configurado para 2. Aumente o valor se seu aplicativo acessar mais de dois sites remotos para o conteúdo.
<proxy:meta-data> <proxy:name>maxconnectionsperhost</proxy:name> <proxy:value>2</proxy:value> </proxy:meta-data>
O maxtotalconnections é o total máximo de conexões suportado pelo proxy. O valor padrão é 5. O valor escolhido deve ser alto o suficiente para suportar o número de conexões simultâneas que você pode receber. Na prática, é o fator de como o contêiner da Web é configurado e de quantas conexões simultâneas o contêiner suporta.
<proxy:meta-data> <proxy:name>maxtotalconnections</proxy:name> <proxy:value>5</proxy:value> </proxy:meta-data>
O socket-timeout define o tempo limite de espera de soquete padrão em milissegundos para os dados quando uma conexão for estabelecida. O padrão é um valor de tempo limite 0 que é interpretado como um tempo limite infinito.
<proxy:meta-data> <proxy:name>socket-timeout</proxy:name> <proxy:value>5000</proxy:value> </proxy:meta-data>
O retries define o número de novas tentativas de soquete que o proxy Ajax deve executar antes de desistir de estabelecer uma conexão. O valor padrão é duas novas tentativas.
<proxy:meta-data> <proxy:name>retries</proxy:name> <proxy:value>3</proxy:value> </proxy:meta-data>
O tempo limite de conexão define o tempo em milissegundos antes que uma conexão seja estabelecida. Se nenhum valor for especificado, o valor padrão usado será 60000. Se 0 for usado, o valor será interpretado de modo que nenhum tempo limite será usado.
<proxy:meta-data> <proxy:name>connection-timeout</proxy:name> <proxy:value>3000</proxy:value> </proxy:meta-data>
O tempo limite de conexão define o tempo em milissegundos antes que uma conexão seja estabelecida. Esse é o caso para todas as solicitações subsequentes depois que maxtotalconnections é excedido. Se 0 for usado, o valor será interpretado de modo que nenhum tempo limite será usado. Zero (0) também é o valor padrão.
<proxy:meta-data> <proxy:name>connection-pool-timeout</proxy:name> <proxy:value>1000</proxy:value> </proxy:meta-data>
Por padrão, o proxy Ajax encaminhará apenas os códigos de status HTTP maiores ou iguais a 200 e menores que 400. Os códigos de status que estiverem fora do intervalo automaticamente são alterados para o erro 404 Arquivo Não Localizado. A única exceção é o código 401 (não autorizado), que resulta no erro 403 Proibido, a menos que o atributo basic-auth-support seja ativado para esse pedido específico.
É possível encaminhar códigos HTTP maiores ou iguais a 400 com uma mensagem ao configurar o meta parâmetro forward-http-errors no arquivo proxy-config.xml
<proxy:meta-data> <proxy:name>forward-http-errors</proxy:name> <proxy:value>true</proxy:value> </proxy:meta-data>
O proxy do Ajax pode ser configurado para conectar-se a um outro proxy antes de acessar a rede. A conexão com um proxy de passagem poderá ser necessária se o proxy do Ajax precisar passar por um firewall delimitador antes de acessar a rede. O proxy do Ajax suporta a autenticação Básica.
O exemplo a seguir mostra a configuração de um firewall de proxy fictício. O passthru_host é um parâmetro obrigatório. Outros como passthru_type, passthru_username e passthru_password são parâmetros opcionais. O parâmetro passthru_type significa o tipo de autenticação usado. O tipo padrão é BASIC. Alternativamente, DIGEST e NTLM podem ser usados também. NTLM requer os parâmetros adicionais passthru_hostname e passthru_domain. Os parâmetros passthru_port e passthru_realm também são opcionais. Se um parâmetro passthru_port não for especificado, um valor padrão da porta 80 será utilizado. Se um parâmetro passthru_realm não for especificado, as credenciais serão enviadas para todas as tentativas de autenticação. Especifique o parâmetro passthru_realm em um ambiente de produção para evitar que as informações de nome de usuário e de senha sejam apresentadas para todos os pedidos de autenticação.
<proxy-meta-data> <proxy:name>passthru_type</proxy:name> <proxy:value>BASIC</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_host</proxy:name> <proxy:value>9.17.237.132</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_port</proxy:name> <proxy:value>3128</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_realm</proxy:name> <proxy:value>MyRealm</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_username</proxy:name> <proxy:value>username</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_password</proxy:name> <proxy:value>password</proxy:value> </proxy-meta-data>
A autenticação básica pode ser ativada ao configurar o atributo basic-auth-support para uma política no arquivoproxy-config.xml. Por exemplo:
<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/proxy/*" /> <proxy:policy url="*" acf="none" basic-auth-support="true"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
No exemplo, o proxy Ajax encaminhará as informações de status e de cabeçalho HTTP de volta para o serviço e cliente de destino. Se basic-auth-support não for configurado e o proxy Ajax receber um pedido 401, o proxy mapeará o pedido para um código 403 : HTTP Proibido.
Nota: Atualmente, o mecanismo de Autenticação Básica é o único método de autenticação HTTP suportado pelo proxy.
A Filtragem de IP do proxy Ajax permite criar lista de desbloqueio ou de bloqueio de endereços IP para proteger os serviços com os quais o proxy Ajax também possa se conectar. A lista de bloqueio contém os endereços IP de serviço que os clientes também não podem se conectar, enquanto que a lista de desbloqueio contém endereços IP de serviços que o proxy Ajax também pode se conectar.
O proxy:ipfilter define os endereços IP para o filtro. O proxy:allow define a lista de desbloqueio para um endereço ou um intervalo de endereços IP. O proxy:deny define a lista de bloqueio de um endereço ou um intervalo de endereços IP.
Por exemplo:<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/proxy/*" > <proxy:ipfilter> <proxy:deny>9.6.0.0/255.255.0.0</proxy:deny> <proxy:allow>9.6.1.0/255.255.255.0</proxy:allow> <proxy:deny>9.6.1.4</proxy:deny> </proxy:ipfilter> </proxy:mapping> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
CWXJX1000E: O destino especificado que hospeda o endereço IP é proibido por regra.
Entretanto, o proxy Ajax acessa 9.6.1.5 ou 9.6.1.120, mas não negará acesso a 9.6.1.4.
Outro exemplo é iniciado por uma lista de bloqueios de todos os endereços IP, porém inclui intervalos de IP adicionais. Neste exemplo, o seguinte elemento de código bloqueia todos os endereços: *.*.*.*. O endereço IP no intervalo 98.137.80.1 a 98.137.254 é suportado.
<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/rss/economy" url="http://rss.news.yahoo.com"> <proxy:ipfilter> <proxy:deny>*.*.*.*</proxy:deny> <proxy:allow>98.137.80.0/255.255.255.0</proxy:allow> </proxy:ipfilter> </proxy:mapping> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
Conforme você inclui novas regras de filtro, é possível combiná-las de várias formas, mas o proxy Ajax sempre as manipula na ordem na qual elas são definidas. Isso significa que a última regra correspondente sempre tomará efeito, independente de quaisquer regras de permissão ou de negação que vierem antes dela.