Requêtes et réponses de règles de fournisseur de contenu

Utilisez les onglets Requête et Réponse pour définir un contrôle à granularité fine sur les en-têtes HTTP, les cookies HTTP et les filtres. Filters provide a programmatic control over content during the request and response phases of the interaction between HCL Digital Experience and the web application.

En-têtes

Spécifiez les en-têtes autorisés (propagés) ou bloqués dans les demandes et les réponses vers et à partir du fournisseur de contenu. Par défaut, le Web Application Bridge propage tous les en-têtes côté client. Les en-têtes côté client sont présents dans la demande reçue à partir du navigateur. Web Application Bridge ne propage pas les en-têtes qui sont répertoriés dans la zone de blocage.

Cliquez sur Insérer un en-tête pour ajouter les en-têtes personnalisés. Les en-têtes personnalisés sont utiles pour les scénarios suivants :
  • Pour ajouter des en-têtes qui n'existent pas dans la requête provenant du navigateur
  • Pour ajouter des en-têtes qui n'existent pas dans la requête provenant du fournisseur de contenu
  • Pour utiliser la connexion unique
  • Pour envoyer plus d'informations
Si vous ajoutez un en-tête personnalisé portant le même nom qu'un en-tête existant, l'en-tête personnalisé remplace l'en-tête existant.

Cookies

Spécifiez les cookies autorisés ou bloqués dans la demande provenant du navigateur ou dans la réponse provenant du fournisseur de contenu. Par défaut, l'option Web Application Bridge empêche tous les cookies côté client d'atteindre le fournisseur de contenu. Les cookies côté client sont présents dans la demande reçue à partir du navigateur. Vous devez spécifier les cookies côté client qui doivent être propagés en sélectionnant l'onglet Tout bloquer, excepté dans la section Cookies de l'onglet Demande et en spécifiant des cookies individuels.

Cliquez sur Insérer des cookies pour ajouter des cookies personnalisés. Les cookies personnalisés sont utiles pour les scénarios suivants :
  • Pour ajouter des cookies qui n'existent pas dans la requête provenant du navigateur
  • Pour ajouter des cookies qui n'existent pas dans la réponse provenant du fournisseur de contenu
  • Pour utiliser la connexion unique
  • Pour envoyer plus d'informations

Si vous ajoutez un cookie personnalisé portant le même nom qu'un cookie existant, le cookie personnalisé remplace le cookie existant. Si vous ajoutez un cookie de réponse personnalisé, Web Application Bridge ajoute un en-tête Set-Cookie. Web Application Bridge utilise le nom et la valeur fournis dans les réponses envoyées depuis le Servlet de proxy inverse vers le navigateur.

Filtres

Les filtres sont du code Java et peuvent être lancés sur demande pour exécuter des actions personnalisées. Ils modifient la demande à l'aide d'un programme. Les filtres sont des extensions de la fonction principale. Utilisez l'API de filtre de servlet pour créer des filtres personnalisés. Les filtres manipulent la demande ou la réponse du portail au fournisseur de contenu. Les développeurs créent les filtres. Tout d'abord, l'administrateur clique sur Insérer un filtre de demandes pour indiquer le jeu de filtres pouvant être appliqués à cette règle. Ensuite, l'administrateur clique sur Ajouter un filtre pour appliquer le filtre à la règle.

Procédez comme suit pour créer des filtres personnalisés :
  1. Créez un fichier Java avec l'un des exemples de codes suivants.
    Le code suivant insère un exemple d'en-tête et un cookie dans une demande qui va du portail vers le site du fournisseur de contenu :
    
    /* @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
    
        }
    
    }
    Le code suivant est un filtre de réponse :
    
    /* @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. Procédez comme suit pour utiliser le filtre :
    Remarque : Dans un environnement de cluster, le fichier JAR de filtre doit être installé sur tous les noeuds.
    1. Créez un fichier Java de composant de filtre avec au moins une classe implémentant l'interface javax.servlet.Filter.
    2. Compilez le fichier Java de composant de filtre sur les éléments suivants :
      • Servlet VWAT (runtime.jar dans le répertoire wp_profile/installedApps/cell-name/wp.vwat.servlet.ear.ear/wp.vwat.servlet.war/WEB-INF/lib)
      • Fichiers JAR du moteur VWAT (dans le répertoire PortalServer\bp\wp.vwat.engine\shared\app\wp.vwat.engine.jar)
      • Tous les fichiers compressés et d'archive de portail et Java IBM® WebSphere® Application Server
      Conseil : Utilisez le projet Portal Rational Application Developer car il dispose déjà des chemins de génération corrects pour HCL Digital Experience et IBM® WebSphere® Application Server.
    3. Générez un fichier .jar avec les fichiers de classe compilés.
    4. Placez le fichier .jar dans le répertoire PortalServer/shared/app.
      Remarque : Dans un environnement de cluster, placez le fichier .jar dans le répertoire PortalServer/shared/app de chaque nœud.
    5. Redémarrez le serveur WebSphere_Portal.
      Remarque : Dans un environnement de cluster, redémarrez également tous les noeuds.