8
votes

Tomcat: Comment accéder à (session) Manager du servlet

J'ai besoin d'accéder au responsable du servlet (ou du filtre) dans Tomcat pour charger la session personnalisée par identifiant de session personnalisé.

Répondre à votre prochaine question: Pourquoi en ai-je besoin? Il y a un ancien bogue en Flash qui lui permet d'envoyer des cookies d'IE et non du navigateur actuel. Donc, si je suis à FF et que j'essaie de télécharger le fichier avec Swfupload, je me retrouve avec la mauvaise session et une erreur.

Je souhaite ajouter le paramètre magique à la poste qui devrait remplacer l'ID de session par défaut (incorrect), puis chargez la session personnalisée au lieu d'un chargé par Tomcat. Je ne peux pas utiliser la réécriture d'URL car les cookies sont résolus en premier et lorsque Flash envoie un mauvais cookie de IE, Tomcat n'essaie pas de charger la session de l'adresse URL-réécrit.

J'apprécierais tout autre indice comment accéder au responsable du contexte ou une solution du problème initial.

Merci d'avance, Juriy


0 commentaires

4 Réponses :


4
votes

Il doit être accessible via la mise en oeuvre de servleContext . Obtenez les sources de Tomcat pour vérifier cela ou utiliser la réflexion pour obtenir tous les domaines du contexte. Vous devrez peut-être utiliser beaucoup de réflexion pour vous rendre au responsable.

(Je n'ai pas pu trouver si le responsable est exposé dans JNDI, mais vous pouvez aussi regarder ici)


0 commentaires

8
votes

pour tomcat: xxx


0 commentaires

8
votes

par opposition à IHOR S, ce code utilise un peu moins d'abstraction en obtenant manager à partir de httpsession : xxx < / pré>


0 commentaires

0
votes
private Manager getManager(ServletContext servletContext) {
        try {
            ApplicationContextFacade applicationContextFacade = (ApplicationContextFacade) servletContext;
            Field applicationContextFacadeField = ApplicationContextFacade.class.getDeclaredField("context");
            applicationContextFacadeField.setAccessible(true);
            ApplicationContext appContext = (ApplicationContext) applicationContextFacadeField.get(applicationContextFacade);
            Field applicationContextField = ApplicationContext.class.getDeclaredField("context");
            applicationContextField.setAccessible(true);
            StandardContext stdContext = (StandardContext) applicationContextField.get(appContext);
            return stdContext.getManager();
        } catch (Exception e) {
            //skip this as we can also use Manager as null for metrics
            //"Unable to get Catalina Manager. Cause: {}", e.getMessage() , e;
        }
        return null;
    }

1 commentaires

Veuillez ajouter quelques explications à votre réponse, de sorte que d'autres puissent en apprendre