تنفيذ إدارة الجلسة الموزعة في الربيع
تنفذ هذه المقالة بشكل أساسي الجلسة الموزعة في الربيع ، وتستخدم Redis لاستمرار الجلسة. وبهذه الطريقة ، عند نشر التطبيق ، ليست هناك حاجة لتكوين توزيعها في حاويات مثل الراتنج و tomcat ، والتي تعد مريحة لإضافة خوادم عقدة جديدة لتوسيع الكتلة. لا تعتمد الجلسة على خوادم كل عقدة ويمكن الحصول عليها مباشرة من redis. فيما يلي الكود الأساسي للوظيفة:
1. قم بتكوينه أولاً في web.xml
أضف إلى اعتراض:
<!-بدء الجلسة الموزعة-> <ilter> <filter-name> distributedSessionFilter </filter-name> <ilter-class> distributedSessionFilter </filter-class> <Ing-param> <!-مطلوب ، مفتاح. 2 طرق ، 1 يتوافق مع الفول ، التنسيق هو الفول: المفتاح. 2 سلاسل ، تنسيقات مثل: AFFFFRFGV-> <Param-Name> مفتاح </param-name> <param-value> xxxxxxxx </param-value> </IPAR-PARAM> <ING-PARAM> <!-مطلوب ، الفاصوليا المقابلة لـ redis: xx-> <param-name> <Param-value> Bean: Redispersfentive </param-value> // distributedBaseInterface ، المقابلة لهذه الواجهة ، قم بإجراء عملية استمرار الجلسة </init-param> <Ing-param> <!-مطلوب ،-> <mar-name> cookiename </param-name> <Filter-Name> distributedSessionFilter </filter-name> <url-pattern>*. افعل </url-pattern> </filter mapping> <!-نهاية الجلسة الموزعة->
2. تنفيذ المعترض ، الرمز الأساسي هو كما يلي
هناك بشكل أساسي الفئات التالية:
1. توزيع DistributeSessionFilter يقوم بتصفية:
استيراد java.io.ioException ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد javax.servlet.filter ؛ استيراد javax.servlet.filterchain ؛ استيراد javax.servlet.filterconfig javax.servlet.servletresponse ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletrespons org.springframework.web.context.support.webapplicationContextutils ؛ فئة public distributedSessionFilter تنفذ مرشح {private static final logger log = loggerfactory.getLogger (distributedSessionFilter.class) ؛ سلسلة كوكيان الخاصة بالسلسلة ؛ // إنها عملية في الأساس لإدارة الدورة الخاصة distributedSessionManager distributedSessionManager ؛ مفتاح السلسلة الخاصة ؛}طريقة التهيئة عند بدء الحاوية:
Override public void init (filterConfig config) يلقي servletexception {webapplicationContext wac = webapplicationContextUtils.getRequiredWebapplicationContext (config .getServletContext ()) ؛ مفتاح السلسلة = config.getInitParameter ("مفتاح") ؛ string cookiename = config.getInitParameter ("cookiename") ؛ String cachebean = config.getInitParameter ("cachebean") ؛ // احصل على اسم الفول ، والتكوين هو "Bean:" string redisbeanstr = cachebean.substring (5) ؛ distributedBaseInterface distributedCache = (distributedBaseInterface) wac.getBean (redisbeanstr) ؛ // احصل على المفتاح ، وهناك طريقان للتكوين ، 1 يتوافق مع الفول ، والتنسيق هو الفول: مفتاح. 2 سلسلة if (key.startswith ("bean:")) {this.key = (string) wac.getBean (key.substring (5)) ؛ } آخر {this.key = key ؛ } this.cookiename = cookiename ؛ this.distributedSessionManager = distributedSessionManager.getInstance (distributedCache) ؛ // تم حذف معالجة الاستثناء. . . }إجراء اعتراض الطلب الفعلي:
Override public void dofilter (servletrequest servletrequest ، servletResponse servletResponse ، filterchain filterchain) يلقي servletexception ، ioException {distributedhttpletRequestWrapper distreq = null ؛ حاول {// طلب معالجة distreq = createStributedRequest (servletRequest ، servletResponse) ؛ filterchain.dofilter (Distreq ، servletResponse) ؛ } catch (رمي e) {// حذفت. . . } أخيرًا {if (distreq! = null) {try {// بعد معالجة الطلب ، قم بمعالجة الجلسة (بشكل أساسي حفظ جلسة الجلسة) صفقات everafterrequest (distreq.getsession ()) ؛ } catch (رمي e2) {// حذفت. . . }}}}} // طلب distributedhtttbledhttpletRequestWrapper CreatedistributedRequest (servletRequest servletrequest ، servletResponse servletResponse) يلقي ioException ، servleTexception {httpservletrequest = (httplevlestrequest ؛ httpservletresponse استجابة = (httpservletresponse) servletResponse ؛ string usersId = cookieutil.getCoOkie (cookiename ، request) ؛ string actualsid = distributedSessionManager.getActableSID (usersid ، request ، key) ؛ if (stringUtil.isblank (actualsid)) {if (stringUtil.isNotBlank (userSid)) {log.info ( } // كتابة سلسلة ملفات تعريف الارتباط [] userSidarr = distributedSessionManager.createusersId (طلب ، مفتاح) ؛ userSid = userSidarr [0] ؛ cookieutil.setCookie (cookiename ، useredsid ، request ، response) ؛ الفعلي = userSidarr [1] ؛ } actualSid = "SID:" + actualSid ؛ distributedHttpsessionWrapper distsession = null ؛ جرب {map <string ، object> allattribute = distributedSessionManager.getSession (actualsid ، request.getSession () .getMaxInaCtiveInterval ()) ؛ distsession = distributedHttpsessionWrapper جديد (actualsid ، request.getSession () ، allattribute) ؛ } catch (throwable e) {// حدث خطأ ، حذف سجل البيانات المخزنة. خريطة <string ، object> allattribute = new hashmap <string ، object> () ؛ distsession = distributedHttpsessionWrapper جديد (actualsid ، request.getSession () ، allattribute) ؛ distributedSessionManager.Removesession (distsession) ؛ } distributedhttpservletRequestWrapper requestWrapper = new DistributedHttpServletRequestWrapper (طلب ، distsession) ؛ Return requestWrapper ؛ }. } if (session.changed) {distributedSessionManager.Savesession (Session) ؛ } if if (session.invalidated) {distributedSessionManager.Removesession (Session) ؛ } آخر {distributedSessionManager.expire (الجلسة) ؛ }}2. DistributedSessionManager ، يتعامل بشكل أساسي مع الجلسات الموزعة ، الرمز الأساسي:
class distributedSessionManager {logger logger static static static = loggerfactory.getLogger (distributedSessionManager.class) ؛ مثيل initistessionManager ثابت ثابت = فارغ ؛ // Redis يعالج واجهة الجلسة وينفذ DistributedBaseInterface DistributedBaseInterface ؛ بايت ثابت خاص [] قفل = بايت جديد [1] ؛ distributedSessionManager private (DistributedBaseInterface distributedBaseInterface) {this.distributedBaseInterface = distributedBaseInterface ؛ } public statiTedSessionManager getInstance (distributedBaseInterface Redis) {if (مثيل == null) {synchronized (lock) {if (extal == null) {exate = new distributedSessionManager (redis) ؛ }}} مثيل الإرجاع ؛ } // Get Session Public Map <String ، Object> getSession (String SID ، int Second) {String JSON = this.distributedBaseInterface.get (SID ، Second) ؛ if (stringUtil.isnotblank (json)) {return jsonutil.unserializemap (json) ؛ } إرجاع HashMap الجديد <string ، Object> (1) ؛ }. if (maputil.isempty (map)) {return ؛ } String json = jsonutil.serializemap (map) ؛ this.distributedBaseInterface.set (session.getId () ، json ، session.getMaxInaCtiveInterval ()) ؛ }. } Expire public void (DistributedHttpsessionWrapper Session) {distributedBaseInterface.expire (Session.getId () ، session.getMaxInaCtactiveInterval ()) ؛ } /** * إنشاء SID من ملف تعريف الارتباط * /السلسلة العامة [] CreateUsersID (طلب httpservletrequest ، مفتاح السلسلة) {// ...3. DistributedHttsessionWrapper ينفذ httpsession ويقوم بتغليف الجلسة الموزعة ، الكود الأساسي:
الطبقة العامة distributedhttpsessionwrapper تنفذ httpsession {private httpsession orgisession ؛ سلسلة خاصة تغير منطقية = خطأ ؛ المنطقية بطلان = خطأ ؛ خريطة <string ، object> allattribute ؛ DistributedHttpsessionWrapper (سلسلة SID ، جلسة httpsession ، الخريطة <string ، object> allattribute) {this.orgisession = session ؛ this.sid = sid ؛ this.allattribute = allattribute ؛ } Override public string getId () {return this.sid ؛ } Override public void setAttribute (اسم السلسلة ، قيمة الكائن) {change = true ؛ allattribute.put (الاسم ، القيمة) ؛ } Override Public Object GetAttribute (اسم السلسلة) {return allattribute.get (name) ؛ } Override public enumeration <string> getAttributEnames () {set <string> set = allattribute.keyset () ؛ iterator <string> iterator = set.iterator () ؛ إرجاع myenumeration <string> (iterator) ؛ } الفئة الخاصة myenumeration <T> تنفذ التعداد <T> {iterator <T> iterator ؛ myenumeration العامة (iterator <T> iterator) {super () ؛ this.iterator = iterator ؛ } Override public boolean hasmorelements () {return iterator.hasNext () ؛ } Override public t nextElement () {return iterator.next () ؛ }} Override public void inviridate () {this.invalidated = true ؛ } Override public void removeAttribute (اسم السلسلة) {change = true ؛ Allattribute.remove (name) ؛ } Override public getCreationTime () {return orgisession.getCreationTime () ؛ } Override Public GetLastAccatedTime () {return orgisession.getLastAccateCateTime () ؛ } Override public int getMaxInaCtactiveInterval () {return orgisession.getMaxInActiveInterval () ؛ } Override public servletContext getServletContext () {return orgisession.getServletContext () ؛ } Override public object getValue (string arg0) {return orgisession.getValue (arg0) ؛ } Override public string [] getValuenames () {return orgisession.getValuEnames () ؛ } Override public boolean isNew () {return orgisession.isnew () ؛ } Override public void potvalue (String arg0 ، Object Arg1) {orgisession.putvalue (arg0 ، arg1) ؛ } Override public void removeValue (string arg0) {orgisession.removeValue (arg0) ؛ } Override public void setMaxInaCtactiveInterval (int arg0) {orgisession.setMaxInaCtactiveInterval (arg0) ؛ } Override public httpsessioncontext getSessionContext () {return orgisession.getSessionContext () ؛ }4. DistributedHttpservletRequestWrapper تنفذ httpservletrequestwrapper ، يلف الجلسة المعالجة والطلب الأصلي ، الرمز الأساسي:
يمتد الفئة العامة distributedhtpservletrequestwrapper javax.servlet.http.httpletrequestwrapper {private httpservletrequest orgirequest ؛ DistributedHtttsessionWrapper جلسة DistributedHttsessionWrapper ؛ DistributedHttpServleTRequestWrapper (طلب httpservletrequest ، DistributedHttpsessionWrapper جلسة) {super (request) ؛ if (الجلسة == null) {// الاستثناء معالجة. . } if (request == NULL) {// استثناء معالجة. . } this.orgirequest = request ؛ this.session = الجلسة ؛ } distributedHttpsessionWrapper GetSession (Boolean create) {orgirequest.getSession (create) ؛ جلسة العودة ؛ } distributedHttpsessionWrapper getSession () {جلسة الإرجاع ؛ }}5. بالإضافة إلى ذلك ، حدد واجهة DistributedBaseInterface للتعامل مع الجلسة في redis لعمليات الثبات:
الواجهة العامة DistributedBaseInterface { / ** * الحصول على بيانات مخبأة بناءً على مفتاح المفتاح * param * param seconds * / public string get (string key ، int seconds) ؛ / ** * تحديث البيانات المخبأة * @param مفتاح * param json * param seconds */ public void set (string key ، string json ، int seconds) ؛ / *** حذف ذاكرة التخزين المؤقت* param مفتاح*/ public void del (مفتاح السلسلة) ؛ / ** * تعيين بيانات منتهية الصلاحية * @param مفتاح * param seconds */ public void انتهاء صلاحية (مفتاح السلسلة ، int selects) ؛ملاحظة: لا تستخدم هذه المقالة سوى طريقة redis لإدارة الجلسات في الربيع ، وهناك العديد من طرق التنفيذ الأخرى ، مثل التكوين في الحاويات ، وما إلى ذلك ، وتصميم خوارزمية التوجيه لجعل الجلسات تعتمد على خوادم العقدة المختلفة في تَجَمَّع،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،،، ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.