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.

Faça clique em Insert Header para adicionar cabeçalhos personalizados. Os cabeçalhos personalizados são úteis para os seguintes cenários:
  • 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
Se adicionar um cabeçalho personalizado com o mesmo nome de um cabeçalho existente, o cabeçalho personalizado substitui o cabeçalho existente.

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.

Faça clique em Insert Cookies para adicionar cookies personalizados. Os cookies personalizados são úteis para os seguintes cenários:
  • 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.

Execute os seguintes passos para criar filtros personalizados:
  1. 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);
                }
            }
        }
        }
    
    
    }
  2. 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.
    1. Crie um ficheiro Java de componente de filtro com, pelo menos, uma classe que implemente a interface javax.servlet.Filter.
    2. 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.
    3. Crie um ficheiro .jar com os ficheiros de classe compilados.
    4. 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ó.
    5. Reinicie o servidor do WebSphere_Portal.
      Nota: Num ambiente de conjunto de unidades, reinicie também todos os nós.