IBM WebSphere Portal 8.5: Assistência ao utilizador para administradores |
---|
Pedidos e respostas da política de fornecedor de conteúdo
Utilize os separadores Pedido e Resposta para definir um controlo mais específico sobre cabeçalhos HTTP, cookies HTTP e filtros. Os filtros fornecem um controlo programático sobre o conteúdo durante as fases de pedido e resposta da interacção entre o IBM® WebSphere Portal e a aplicação da Web.
Cabeçalhos
Especifique os cabeçalhos permitidos (propagados) ou bloqueados nos pedidos e respostas de e para o fornecedor de conteúdo. Por predefinição, o Web Application Bridge propaga todos os cabeçalhos do lado do cliente. Os cabeçalhos do lado do cliente estão presentes no pedido recebido do navegador. O Web Application Bridge não propaga cabeçalhos que estejam indicados no campo de bloqueio.
- Para adicionar mais cabeçalhos que não estejam presentes no pedido do navegador
- Para adicionar mais cabeçalhos que não estejam presentes no pedido do fornecedor de conteúdo
- Para utilizar início de sessão único
- Para enviar mais informações
Cookies
Especifique os cookies permitidos ou bloqueados no pedido do navegador ou na resposta do fornecedor de conteúdo. Por predefinição, o Web Application Bridge impede que todos os cookies do lado do cliente acedam ao fornecedor de conteúdo. Os cookies do lado do cliente estão presentes no pedido recebido do navegador. É necessário especificar os cookies do lado do cliente que é necessário propagar, seleccionando Bloquear tudo, excepto na secção Cookies do separador Pedido e especificando cookies individuais.
- Para adicionar mais cookies que não estejam presentes no pedido do navegador
- Para adicionar mais cookies que não se encontrem na resposta do fornecedor de conteúdo
- Para utilizar início de sessão único
- Para enviar mais informações
Se adicionar um cookie de pedido personalizado com o mesmo nome de um cookie existente, o cookie personalizado substitui o cookie existente. Se adicionar um cookie de resposta personalizado, o Web Application Bridge adiciona um cabeçalho "Set-Cookie". O Web Application Bridge utiliza o nome e o valor fornecidos nas respostas que são enviadas da servlet do Proxy inverso para o navegador.
Filtros
Os filtros são código Java que pode ser iniciado a pedido para executar acções personalizadas. Os filtros modificam o pedido de forma programática. Os filtros são extensões da funcionalidade de núcleo. Utilize a API de filtros da servlet para criar filtros personalizados. Os filtros manipulam o pedido ou resposta a partir do portal para o fornecedor de conteúdo. Os programadores criam os filtros. Em primeiro lugar, o administrador faz clique em Inserir filtro de pedido para especificar o conjunto de filtros que estão disponíveis para aplicar a esta política. Em seguida, o administrador faz clique em Adicionar filtro para aplicar o filtro à política.
- Crie um ficheiro Java com um dos seguintes códigos exemplo.
- O código que se segue insere um cabeçalho exemplo e um cookie num pedido que vai do portal para o sítio do fornecedor de conteúdo:
-
/* @copyright module */ /* */ /* DISCLAIMER OF WARRANTIES: */ /* ------------------------- */ /* The following [enclosed] code is sample code created by IBM Corporation. */ /* This sample code is provided to you solely for the purpose of assisting */ /* you in the development of your applications. */ /* The code is provided "AS IS", without warranty of any kind. IBM shall */ /* not be liable for any damages arising out of your use of the sample code, */ /* even if they have been advised of the possibility of such damages. */ package com.ibm.wps.wab.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import com.ibm.portal.um.PumaHome; import com.ibm.portal.um.PumaProfile; import com.ibm.portal.um.User; import com.ibm.portal.um.exceptions.PumaException; import com.ibm.wps.vwat.servlet.ReverseProxyRequest; @SuppressWarnings("unused") public class SampleRequestFilter implements Filter { private ReverseProxyRequest reverseProxyRequest = null; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { this.reverseProxyRequest = (ReverseProxyRequest)request; //add a custom cookie String cookieName = "TestCookieName"; String cookieValue = "TestCookieValue"; addCookie(cookieName, cookieValue); //add a custom header String headerName = "TestHeaderName"; String headerValue = "TestHeaderValue"; addHeader(headerName, headerValue); //Please not do not remove this chain.doFilter(request, response); } public void addCookie(final String name, String value) { if (name == null || name.trim().length() == 0) { return; } if (value != null) { value = value.trim(); } else { value = ""; } String cookieHeader = reverseProxyRequest.getConnection().getRequestProperty("Cookie"); if(cookieHeader != null) cookieHeader = cookieHeader + ";" + name + "=" + value; else cookieHeader = name + "=" + value; reverseProxyRequest.getConnection().setRequestProperty("Cookie", cookieHeader); } public void addHeader(final String name, final String value) { if (name == null || name.trim().length() == 0) { return; } this.reverseProxyRequest.getConnection().addRequestProperty(name, value); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
- O seguinte código é um filtro de resposta:
-
/* @copyright module */ /* */ /* DISCLAIMER OF WARRANTIES: */ /* ------------------------- */ /* The following [enclosed] code is sample code created by IBM Corporation. */ /* This sample code is provided to you solely for the purpose of assisting */ /* you in the development of your applications. */ /* The code is provided "AS IS", without warranty of any kind. IBM shall */ /* not be liable for any damages arising out of your use of the sample code, */ /* even if they have been advised of the possibility of such damages. */ package com.ibm.wps.wab.filter; import java.io.IOException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletOutputStream; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import com.ibm.wps.vwat.servlet.ReverseProxyRequest; import com.ibm.wps.vwat.servlet.ReverseProxyResponse; @SuppressWarnings("unused") public class SampleRequestFilter implements Filter { private ReverseProxyResponse reverseProxyResponse = null; private String encoding = null; private Map<String, String> matchAndReplace = null; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { this.reverseProxyResponse = (ReverseProxyResponse)response; String contentType = reverseProxyResponse.getHeaderValue("Content-Type"); if(contentType != null && contentType.equals("text/html; charset=UTF-8")){ Collection<String> headers = reverseProxyResponse.getConnection().getHeaderFields().keySet(); String[] names = headers.toArray(new String[headers.size()]); for (int i = 0; i < names.length; i++) { String header = names[i]; if (header.trim().equalsIgnoreCase("Content-Encoding")) { encoding = reverseProxyResponse.getConnection().getHeaderField(header); break; } } ResponseWrapper wrapper = new ResponseWrapper(reverseProxyResponse, encoding); wrapper.setMatchAndReplace(); } //Please not do not remove this chain.doFilter(request, wrapper); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } class ResponseWrapper extends ReverseProxyResponse{ private static final int BYTE_BUFFER_SIZE = 8192; ReverseProxyResponse proxyResponse; private String encoding = null; private int contentLength = -1; private boolean _changed = false; private ReverseProxyResponse response = null; private Map<String, String> matchAndReplace = null; public ProxyResponseWrapper(ReverseProxyResponse resp, String encoding) throws UnsupportedEncodingException { super(resp, resp.getConnection()); isDebugEnabled = true; response = resp; } public void setMatchAndReplace() { Map<String, String> replacers = new HashMap<String, String>(); replacers.put("top","self"); if (replacers != null && replacers.size() != 0) { matchAndReplace = replacers; } } @Override public ServletOutputStream getOutputStream() throws IOException { BaseOutputStreamWrapper streamWrapper = new BaseOutputStreamWrapper(super.getOutputStream()); return streamWrapper; } class BaseOutputStreamWrapper extends ServletOutputStream { private static final int BYTE_BUFFER_SIZE = 4 * 1024; private ServletOutputStream originalStream = null; public BaseOutputStreamWrapper(final ServletOutputStream originalStream) { this.originalStream = originalStream; } @Override public void write(byte[] arg0, int arg1, int arg2) throws IOException { if (contentType == null || !contentType.contains("text/html")) { super.write(arg0, arg1, arg2); return; } ByteArrayInputStream bios = new ByteArrayInputStream(arg0); InputStream in = bios; if (encoding != null && encoding.indexOf("gzip") != -1) { in = new GZIPInputStream(bios, BYTE_BUFFER_SIZE); } byte[] resultInBytes = IOSupport.readStream(in); contentLength = resultInBytes.length; if (charset == null || charset.trim().isEmpty()) { charset = "UTF-8"; } String original = new String(resultInBytes, charset); String modified = new String(original); if (isDebugEnabled) { LOGGER.text(Logger.TRACE_HIGH, METHOD_NAME, "Checking for text replacements."); } if (matchAndReplace != null && matchAndReplace.size() != 0) { Iterator<String> iter = matchAndReplace.keySet().iterator(); while (iter.hasNext()) { String key = iter.next(); if (modified.contains(key)) { if (isDebugEnabled) { LOGGER.text(Logger.TRACE_HIGH, METHOD_NAME, "Attempting replacement for " + key); } modified = modified.replace(key, matchAndReplace.get(key)); _changed = true; } } } if (isDebugEnabled) { LOGGER.text(Logger.TRACE_HIGH, METHOD_NAME, "Replacements if found, have been done."); } if (_changed) { resultInBytes = modified.getBytes(charset); contentLength = resultInBytes.length; response.setContentLength(contentLength); ByteArrayOutputStream baos = null; if (encoding != null && encoding.indexOf("gzip") != -1) { baos = new ByteArrayOutputStream(); GZIPOutputStream zipOut = new GZIPOutputStream(baos); if (resultInBytes != null) { zipOut.write(resultInBytes, 0, contentLength); } zipOut.finish(); zipOut.flush(); contentLength = baos.size(); response.setContentLength(contentLength); ByteArray bytes = new ByteArray(bytePool); bytes.reset(); bytes.ensureCapacity(BYTE_BUFFER_SIZE); bytes.append(baos.toByteArray()); bytes.empty(this.originalStream); } else { in = new ByteArrayInputStream(resultInBytes, 0, contentLength); boolean done = false; int count = 0; ByteArray bytes = new ByteArray(bytePool); bytes.reset(); bytes.ensureCapacity(BYTE_BUFFER_SIZE); while (!done) { int read = bytes.fill(in); if (read == -1) { done = true; } else { count += read; bytes.empty(this.originalStream); } } } } else { super.write(arg0, arg1, arg2); } } } } }
- Execute os seguintes passos para integrar o filtro:Nota: Num ambiente de conjunto de unidades, o ficheiro jar de filtro deve ser colocado em todos os nós.
- Crie um ficheiro Java de componente de filtro com, pelo menos, uma classe que implemente a interface javax.servlet.Filter.
- Compile o ficheiro Java de componente de filtro nos seguintes itens:
- Servlet VWAT (runtime.jar no directório wp_profile/installedApps/cell-name/wp.vwat.servlet.ear.ear/wp.vwat.servlet.war/WEB-INF/lib)
- Ficheiros JAR do motor VWAT (no directório PortalServer\bp\wp.vwat.engine\shared\app\wp.vwat.engine.jar)
- Todos os ficheiros comprimidos e de arquivo JAVA do IBM WebSphere Application Server
Sugestão: Utilize o projecto do Portal Rational Application Developer, uma vez que já inclui os caminhos de compilação correctos para o IBM WebSphere Portal e o IBM WebSphere Application Server. - Crie um ficheiro .jar com os ficheiros de classe compilados.
- Coloque o ficheiro .jar no directório PortalServer/shared/app.Nota: Num ambiente de conjunto de unidades, coloque o ficheiro .jar no directório PortalServer/shared/app de cada nó.
- Reinicie o servidor do WebSphere_Portal.Nota: Num ambiente de conjunto de unidades, reinicie também todos os nós.