IBM WebSphere Portal 8.5: Asistencia al usuario para administradores |
---|
Solicitudes y respuestas de políticas de proveedores de contenido
Utilice los separadores Solicitud y Respuesta para definir un control preciso sobre encabezados HTTP, cookies HTTP y filtros. Los filtros proporcionan un control programático sobre el contenido durante las fases de solicitud y respuesta de la interacción entre IBM® WebSphere Portal y la aplicación web.
Encabezados
Especifique los encabezados permitidos (propagados) o bloqueados en las solicitudes y respuestas a y del proveedor de contenido. De forma predeterminada, el Puente de aplicación web propaga todos los encabezados del lado de cliente. Los encabezados de lado de cliente están presentes en la solicitud que se recibe del navegador. El Puente de aplicación web no propaga los encabezados que aparecen en el campo de bloqueo.
- Para añadir más encabezados que no estén ahí en la solicitud del navegador
- Para añadir más encabezados que no estén ahí en la solicitud del proveedor de contenido
- Para usar el inicio de sesión único
- Para enviar más información
Cookies
Especifique las cookies permitidas o bloqueadas en la solicitud del navegador o la respuesta del proveedor de contenido. De forma predeterminada, el Puente de aplicación web bloquea todas las cookies del lado de cliente y hace que no lleguen al proveedor de contenido. Las cookies del lado de cliente están presentes en la solicitud que se recibe del navegador. Debe especificar las cookies del lado de cliente que deben propagarse seleccionando Bloquear todo, excepto en la sección Cookies del separador Solicitud y especificando cookies individuales.
- Para añadir más cookies que no estén ahí en la solicitud del navegador
- Para añadir más cookies que no estén ahí en la respuesta del proveedor de contenido
- Para usar el inicio de sesión único
- Para enviar más información
Si añade una cookie de solicitud personalizada con el mismo nombre que una cookie existente, la cookie personalizada sustituirá a la cookie existente. Si añade una cookie de respuesta personalizada, el Puente de aplicación web añadirá un encabezado "Set-Cookie". El Puente de aplicación web utiliza el nombre y el valor proporcionados en las respuestas enviadas desde el servlet Proxy inverso al navegador.
Filtros
Los filtros son código Java que puede iniciarse bajo demanda para ejecutar acciones personalizadas. Modifican la solicitud mediante programación. Los filtros son extensiones de la característica núcleo. Utilice la API de filtro de servlet para crear filtros personalizados. Los filtros manipulan la solicitud o respuesta del portal al proveedor de contenido. Los desarrolladores crean los filtros. Primero, el administrador pulsa Insertar filtro de solicitud para especificar el conjunto de filtros disponibles que aplicar a esta política. A continuación, el administrador pulsa Añadir filtro para aplicar el filtro a la política.
- Cree un archivo Java con uno de los siguientes códigos de ejemplo.
- El siguiente código inserta un encabezado de ejemplo y una cookie en una solicitud que va del portal al sitio del proveedor de contenido:
-
/* Módulo de @copyright */ /* */ /* DECLARACIÓN DE LIMITACIÓN DE RESPONSABILIDAD DE GARANTÍAS: */ /* ------------------------- */ /* El siguiente código [incluido] es un código de ejemplo creado por */ /* IBM Corporation. Este código de ejemplo se proporciona solo con el fin de */ /* ayudarle a desarrollar aplicaciones. */ /* El código se proporciona "TAL CUAL", sin garantía de ningún tipo. IBM no */ /* será responsable de los daños que puedan producirse por su uso aunque */ /* se le haya advertido de la posibilidad de producirse tales daños. */ 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 } }
- El código siguiente es un filtro de respuesta:
-
/* Módulo de @copyright */ /* */ /* DECLARACIÓN DE LIMITACIÓN DE RESPONSABILIDAD DE GARANTÍAS: */ /* ------------------------- */ /* El siguiente código [incluido] es un código de ejemplo creado por */ /* IBM Corporation. Este código de ejemplo se proporciona solo con el fin de */ /* ayudarle a desarrollar aplicaciones. */ /* El código se proporciona "TAL CUAL", sin garantía de ningún tipo. IBM no */ /* será responsable de los daños que puedan producirse por su uso aunque */ /* se le haya advertido de la posibilidad de producirse tales daños. */ 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); } } } } }
- Complete los pasos siguientes para acoplar el filtro:Nota: En un entorno en clúster, el archivo .jar del filtro debería ponerse en todos los nodos.
- Cree un archivo Java de componente de filtro con al menos una clase que implemente la interfaz javax.servlet.Filter.
- Compile el archivo Java de componentes de filtro comparándolo con los siguientes elementos:
- El servlet VWAT (runtime.jar en el directorio wp_profile/installedApps/nombre-célula/wp.vwat.servlet.ear.ear/wp.vwat.servlet.war/WEB-INF/lib)
- Los archivos JAR del motor VWAT (en el directorio PortalServer\bp\wp.vwat.engine\shared\app\wp.vwat.engine.jar)
- Todos los archivos comprimidos y de archivo Java de IBM WebSphere Application Server y del portal
Consejo: Utilice el proyecto de Portal Rational Application Developer porque ya tiene las vías de acceso de compilación correctas para IBM WebSphere Portal y IBM WebSphere Application Server. - Cree un archivo .jar con los archivos de clase compilados.
- Coloque el archivo .jar en el directorio PortalServer/shared/app.Nota: En un entorno en clúster, coloque el archivo .jar en el directorio PortalServer/shared/app de cada nodo.
- Reinicie el servidor de WebSphere_Portal.Nota: En un entorno en clúster, reinicie también todos los nodos.