java - Servlet 如何通过一般请求参数传递 SessionID
天蓬老师
天蓬老师 2017-04-17 17:57:18
0
2
846

我有个项目,希望在 REST 接口使用 SessionID 作为 Token,这样能简化和用熟悉的方式处理会话数据,在 URL 附加 ;jsessionid= 太丑,传递 Cookie 的话 APP 开发又嫌麻烦,就想通过普通的 GET/POST 参数或自定义 HTTP BODY 来传递 SessionID。

现在的 Servlet 都不再支持通过 ID 获取 Session,搜到的一些方案,比如用监听器来记录 Session,但我不喜欢这种方式,1是我觉得冗余,2是不想自己存储更不想放在内存里;SessionManager 的话就是自定存储了,目前 tomcat,jetty 等的 session 已经满足我的需求了,没必要找这个麻烦。

我查了下 Tomcat 的源码找到了他的 Request 里有 setRequestedSessionId 的方法,只要在 getSession 之前调用就行,但这不是 ServletRequest 接口里的方法,我的项目不一定运行在 Tomcat 里。

来问问有什么简单的方式解决这个问题没?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(2)
Peter_Zhu

Terminé, j'ai vérifié la requête respective (implémentation de HttpServletRequest) de Tomcat et Jetty, et ils ont tous défini l'identifiant de session via un setRequestedSessionId(String). Si j'utilise la réflexion pour obtenir et appeler cette méthode, définissez-la avant getSession. sessionId, après test sur Jetty, cela fonctionne, puis essayez Tomcat. Ces deux conteneurs sont ceux que j'utilise couramment et j'examinerai d'autres conteneurs lorsque je les rencontrerai.

Le code est simple :

    try {
        request.getClass ()
             .getMethod("setRequestedSessionId", String.class)
             .invoke   (request , id);
    } catch ( NoSuchMethodException ex) {
        // Log
    } catch (IllegalAccessException |
           IllegalArgumentException |
          InvocationTargetException ex) {
        // Log
    }

Haha !

Il convient de noter qu'il doit être exécuté avant que la requête actuelle n'appelle getSession pour la première fois. Faites particulièrement attention à savoir s'il existe un filtre dans la couche supérieure qui utilise Session

.

2016/05/21 Résultats expérimentaux mis à jour

Le SessionID peut être remplacé par la méthode ci-dessus, mais la session ne peut pas être supprimée, car la session sera vérifiée une fois supprimée, et le code source de Jetty sera suivi pour découvrir que l'objet Session est défini lorsque la Requête est initialisée, comme indiqué ci-dessous :

Pour le moment, Servlet et Filter n'ont pas été effectués, il n'y a donc aucun moyen de démarrer, il semble donc que la réinitialisation ne soit pas si simple.

Ce qui précède a été testé uniquement sur Jetty, et le résultat a échoué. Il n'y a aucune expérience avec Tomcat. Si vous regardez le code source, il existe une méthode changeSessionId(String) qui devrait être possible en fonction de la logique.


Résultats à nouveau mis à jour le 21/05/2016

Après un lancer constant, le sessionId a été réinitialisé avec succès à l'aide du code suivant :

    try {
        Object obj;
        obj = req.getClass ()
           .getMethod("getSessionManager")
           .invoke   (req);
        obj = obj.getClass ()
           .getMethod("getHttpSession" , String.class)
           .invoke   (obj, sid);
        req.getClass ()
           .getMethod("setSession", HttpSession.class)
           .invoke   (req, (HttpSession) obj);
    } catch ( NoSuchMethodException ex ) {
        // Log
    } catch (IllegalAccessException  |
           IllegalArgumentException  |
          InvocationTargetException ex ) {
        // Log
    }

Rien ne doit être modifié dans le programme exécuté après cela. Vous pouvez utiliser request.getSession() pour lire et écrire la session normalement. Cette méthode est écrite pour Jetty.


Mise à jour des mesures réelles Tomcat du 22/05/2015

Je m'ennuyais après le petit-déjeuner, alors j'ai suivi le code Tomcat, en utilisant les versions Tomcat 7 et 8, et j'ai découvert que l'objet Request remis à l'utilisateur Servlet est une classe proxy appelée RequestFacade, qui ne fonctionne que sur les méthodes de HttpServletRequest. Sans l'implémentation, son objet Request est masqué, donc setRequestedSessionId et les autres méthodes de org.apache.catalina.connector.Request ne peuvent pas être appelées.

Il semble que ce Hack ne puisse être implémenté que pour Jetty.


Bien que les résultats ne soient pas optimistes et que Jetty puisse cacher ces méthodes dans les versions futures, ce processus expérimental nous a permis de mieux comprendre ces deux conteneurs d'applications. Qu'il s'agisse de cookies, de paramètres de chemin d'URL ou de paramètres GET/POST, ils transportent simplement le jeton de session à différents emplacements des données de la requête. Il peut être plus pratique d'encapsuler simplement la connexion côté client

.
Ty80

Utilisez le jeton et placez le jeton dans l'en-tête de la requête. Le front-end est tenu d'apporter ce token lors des demandes

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal