10
votes

J'ai besoin de connaître le port HTTP et HTTPS My Java WebApp est en cours d'exécution sur WebApp StartUp

est-il possible de trouver les ports HTTP et HTTPS configurés pour un serveur Web Tomcat à partir du code Java de l'application Web avant toute demande HTTP ou HTTPS.

J'ai besoin de ces informations sur le démarrage de l'application. Je ne veux pas attendre que quelqu'un initie une requête HTTP et appeler geterverport ().

Ce que je veux, c'est de comprendre les ports HTTP et HTTPS au démarrage de la flux WebApplication.

est-ce possible? J'ai très bien cherché sur ce problème mais n'a guère trouvé des solutions.


1 commentaires

J'ai trouvé ce lien: coderanch.com/t / 364748 / Servlets / Java / ... . Peut-être que cela aidera.


3 Réponses :


0
votes

0 commentaires

0
votes

dans la conférence Conf / Server.xml, dans la configuration du connecteur.

Voici un échantillon, P>

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />


0 commentaires

6
votes

Pour accéder à cette configuration au moment de l'exécution, une solution consiste à créer votre propre vanne, étendue de valveebase code> et enregistrez-le dans la configuration Server.xml (voir http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html ) sous votre Moteur code>. Remplacez le setContainer (conteneur conteneur) code> méthode. Si vous êtes inscrit sous le moteur, le paramètre code> conteneur code> doit être de type standardengine code> . De cela, vous pouvez appeler gettervis () code> pour faire référence à la service code> . Le service a une méthode FindConnectors () code>. Qui renvoie un tableau de connecteur code> instances, reflétant les connecteurs configurés (points de terminaison) pour votre service. D'eux, vous pouvez obtenir le port configuré en appelant getport () code>.

Vous devrez avoir Catalina.jar sur votre parcours de construction. Remarque, ceci est invoqué au démarrage du serveur afin que vous fassiez stocker les informations de port dans certains stockages disponibles au niveau mondial si vous en avez besoin d'y accéder ultérieurement. P>

Si vous ne voulez pas le faire dans une vanne , les choses deviendront un peu plus sale car vous devrez utiliser l'introspection et la rupture de confinement de visibilité sur le terrain. P>

Il s'agit d'un échantillon d'un filtre standard qui extrait les informations de port dans le init () code > Méthode P>

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.catalina.Container;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.commons.lang3.reflect.FieldUtils;

public class TestFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        arg2.doFilter(arg0, arg1);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        ServletContext ctx = arg0.getServletContext();

        try {
            Object o = FieldUtils.readField(ctx, "context", true);
            StandardContext sCtx = (StandardContext) FieldUtils.readField(o, "context", true);
            Container container = (Container) sCtx;

            Container c = container.getParent();
        while (c != null && !(c instanceof StandardEngine)) {
            c = c.getParent();
        }

        if (c != null) {
            StandardEngine engine = (StandardEngine) c;
            for (Connector connector : engine.getService().findConnectors()) {
                // Get port for each connector. Store it in the ServletContext or whatever
                System.out.println(connector.getPort());
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}


1 commentaires

Je m'attendais à une réponse beaucoup plus simple. Mais on dirait qu'il n'y a pas de solution simple à ce problème car ce cas n'est pas couvert par l'API de servlet. Par conséquent, je vais marquer cette question aussi correcte.