cari

Rumah  >  Soal Jawab  >  teks badan

java - Servlet 如何通过一般请求参数传递 SessionID

我有个项目,希望在 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 里。

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

天蓬老师天蓬老师2797 hari yang lalu838

membalas semua(2)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-17 17:59:18

    Selesai, saya menyemak Permintaan masing-masing (pelaksanaan HttpServletRequest) Tomcat dan Jetty, dan mereka semua menetapkan id sesi melalui setRequestedSessionId(String Jika saya menggunakan refleksi untuk mendapatkan dan memanggil kaedah ini, tetapkannya sebelum getSession. sessionId, selepas ujian di Jeti, ia berfungsi, kemudian cuba Tomcat. Kedua-dua bekas ini adalah yang biasa saya gunakan dan saya akan menyemaknya apabila saya menemui bekas lain.

    Kodnya mudah:

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

    Haha!

    Perlu diambil perhatian bahawa ia mesti dilaksanakan sebelum permintaan semasa memanggil getSession buat kali pertama Beri perhatian khusus sama ada terdapat Penapis di lapisan atas yang menggunakan Sesi


    2016/05/21 Mengemas kini keputusan percubaan

    ID Sesi boleh digantikan dengan kaedah di atas, tetapi Sesi tidak boleh dikeluarkan, kerana Sesi akan disahkan apabila dikeluarkan, dan kod sumber Jetty akan dijejaki untuk mengetahui bahawa objek Sesi ditetapkan apabila Permintaan dimulakan, seperti yang ditunjukkan di bawah:

    Pada masa ini, Servlet dan Penapis belum dijalankan, jadi tiada cara untuk bermula, jadi nampaknya tetapan semula tidak semudah itu.

    Perkara di atas hanya diuji di Jeti, dan hasilnya gagal. Tiada percubaan pada Tomcat Jika anda melihat kod sumber, terdapat kaedah changeSessionId(String) Ia boleh dilakukan berdasarkan logik.


    Keputusan dikemas kini sekali lagi pada 21/05/2016

    Selepas melambung berterusan, sessionId berjaya ditetapkan semula menggunakan kod berikut:

        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
        }

    Tiada apa-apa yang perlu diubah dalam program yang dilaksanakan selepas ini Anda boleh menggunakan request.getSession() untuk membaca dan menulis Sesi seperti biasa.


    Kemas kini ukuran sebenar 2015/05/22 Tomcat

    Saya bosan selepas sarapan pagi, jadi saya menjejaki kod Tomcat, menggunakan versi Tomcat 7 dan 8, dan mendapati objek Permintaan yang diserahkan kepada Servlet pengguna ialah kelas proksi yang dipanggil RequestFacade, yang hanya beroperasi pada kaedah HttpServletRequest antara muka. Tanpa pelaksanaan, objek Permintaannya disembunyikan, jadi setRequestedSessionId dan kaedah lain org.apache.catalina.connector.Request tidak boleh dipanggil.

    Nampaknya Hack ini hanya boleh dilaksanakan untuk Jeti.


    Walaupun hasilnya tidak optimistik, dan Jeti mungkin menyembunyikan kaedah tersebut dalam versi masa hadapan, proses percubaan ini telah memberikan kami pemahaman yang lebih baik tentang kedua-dua bekas aplikasi ini. Sama ada kuki, Parameter Laluan URL atau parameter GET/POST, ia hanya membawa Token Sesi di lokasi data permintaan yang berbeza Mungkin lebih mudah untuk merangkumkan sambungan pada bahagian klien.

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 17:59:18

    Gunakan token dan letakkan token dalam pengepala permintaan. Bahagian hadapan dikehendaki membawa token ini apabila membuat permintaan

    balas
    0
  • Batalbalas