تصف هذه المقالة التنفيذ البسيط لتوفير جلسة Java إلى Redis. شاركه للرجوع إليه ، على النحو التالي:
في موازنة التحميل ، إذا وصل المستخدم إلى جهاز مختلف ولا يقوم بتزامن الجلسة ، فسيتم طلب المستخدم ، وهو أمر سيء للغاية لتجربة المستخدم ، لذلك من الضروري للغاية بالنسبة لنا تنفيذ مزامنة الجلسة. ضع الجلسة على خادم REIDS CACHE يمكن حل المشكلة بشكل جيد. فيما يلي تطبيق بسيط للرمز.
1. تكوين مرشح web.xml:
<Ivilter> <iliter-name> SessionFilter </filter-name> <lipter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> </ilter> </filter-mapping> <filter-name> sessionfilter </filter-name>
2. تكوين اسم المرشح المقابل:
<bean id = "sessionfilter"> <property name = "redistemplate" ref = "redistemplate"/> </bean>
تنفيذ SessionFilter:
يمتد SessionFilter من الطبقة العامة genericfilterbean {private redistemplate redistemplate ؛ Override public void dofilter (servletRequest request ، servletResponse Response ، filterchain chain) يلقي iOexception ، servletexception {system.out.println ("filter") ؛ httpservletrequest re = (httpservletrequest) طلب ؛ httpservletresponse res = (httpservletresponse) ؛ terryhttpservletRequestWrapper clospper = new terryhttpservletRequestWrapper (Re ، res ، redistemplate) ؛ Chain.dofilter (Wrapper ، Response) ؛ } redistemplate getRedIstemplate () {retristemplate return ؛ } public void setRediStemplate (redistemplate redistemplate) {this.redistemplate = redistemplate ؛ }}4. تنفيذ TerryHttpservletRequestWrapper:
الطبقة العامة terryhttpservletRequestWrapper يمتد httpservletrequestwrapper {private cachehttpsession. استجابة خاصة httpservletresponse ؛ redistemplate redistemplate الخاص ؛ Public TerryHttpservletRequestWrapper (طلب httpservletrequest ، استجابة httpservletresponse ، redistemplate redistemplate) {super (request) ؛ this.redistemplate = الرد ؛ this.redistemplate = redistemplate ؛ } Override public httpsession getSession (boolean create) {if (session! = null) {return session ؛ } string sid = "terry" + system.currentTimeMillis () ؛ WriteSidTocookie (SID) ؛ الجلسة = cachehttpsession جديدة (null ، sid ، redistemplate) ؛ جلسة العودة ؛ } Override public httpsession getSession () {return getSession (false) ؛ } void محمية inctedSidTocookie (String Sid) {cookie mycookies = new cookie ("terry" ، sid) ؛ mycookies.setMaxage (-1) ؛ mycookies.setdomain ("locahost") ؛ mycookies.setPath ("/") ؛ Response.addcookie (mycookies) ؛ }}5. تنفيذ Cachehttpsession:
الطبقة العامة cachehttpsession يمتد httpsessionwrapper {private string sid ؛ redistemplate redistemplate الخاص ؛ private stringredisserializer stringserializer = new StringRedisserializer () ؛ CacheHttpsession (جلسة httpsession ، السلسلة SID ، RediStemplate Redistemplate) {Super (Session) ؛ this.sid = sid ؛ this.redistemplate = redistemplate ؛ } suppressWarnings ("Unchecked") Override التعداد العام <string> getAttributEnames () {Final Byte [] key = StringSerializer.Serialize (SID) ؛ نتيجة الكائن = redistemplate.execute (إعادة صياغة جديدة <Object> () {Override الكائن العام doInredis (اتصال Redisconnection) يلقي DataAccessException {set <byte []> set = connection.keys (key) ؛ return set ؛}}) ؛ if (result! = null) {set <byte []> s = (set <byte []>) نتيجة ؛ تعيين <string> ss = new hashset <string> () ؛ لـ (byte [] b: s) {ss.add (stringSerializer.deserialize (b)) ؛ } التعداد <string> en = new Vector (ss) .elements () ؛ العودة en ؛ } إرجاع فارغ ؛ } suppressWarnings ("Unchecked") Override public void setAttribute (اسم السلسلة ، قيمة الكائن) {final byte [] key = stringerializer.serialize (name) ؛ البايت النهائي [] v = stringserializer.serialize ((سلسلة) قيمة) ؛ redistemplate.execute (جديد rediscallback <ocomp> () {override كائن عام doinredis (اتصال إعادة الاتصال) يلقي dataAccessException {connection.set (المفتاح ، v) ؛ إرجاع null ؛}}) ؛ } Override Public Object GetAttribute (اسم السلسلة) {Final Byte [] key = StringSerializer.serialize (name) ؛ suppressWarnings ("Unchected") قيمة الكائن = redistemplate.execute (إعادة rediscallback جديدة <object> () {Override كائن عام doinredis (اتصال إعادة التوصيل) dataAccessException {return connection.get (key) ؛}}) ؛ قيمة الإرجاع } Override public string getId () {return sid ؛ }}6. تنفيذ httpsessionwrapper:
الطبقة العامة httpsessionwrapper تنفذ httpsession {private httpsession session ؛ httpsessionwrapper العامة (جلسة httpsession) {this.session = الجلسة ؛ } Override public getCreationTime () {return this.session.getCreationTime () ؛ } Override public string getId () {return this.session.getId () ؛ } Override Public GetLastAccatedTime () {return this.session.getLastAccatedTime () ؛ } Override public servletcontext getServletContext () {return this.session.getServletContext () ؛ } Override public void setMaxInaCtactiveInterval (int steral) {this.session.setMaxInaCtactiveInterval (الفاصل الزمني) ؛ } Override public int getMaxInaCtactiveInterval () {return this.session.getMaxInActiveInterval () ؛ } Override public httpsessioncontext getSessionContext () {return this.session.getSessionContext () ؛ } Override public object getAttribute (اسم السلسلة) {return this.session.getAttribute (name) ؛ } Override public object getValue (اسم السلسلة) {return this.session.getValue (name) ؛ } Override public enumeration <string> getAttributEnames () {return this.session.getAtTributEnames () ؛ } Override public string [] getValuenames () {return this.session.getValuenames () ؛ } Override public void setAttribute (اسم السلسلة ، قيمة الكائن) {this.session.setattribute (الاسم ، القيمة) ؛ } Override public void putvalue (اسم السلسلة ، قيمة الكائن) {this.session.putvalue (الاسم ، القيمة) ؛ } Override public void removeAttribute (اسم السلسلة) {this.session.removeattribute (name) ؛ } Override public void removeValue (اسم السلسلة) {this.session.removeValue (name) ؛ } Override public void pervility () {this.session.invalidate () ؛ } Override public boolean isNew () {return this.session.isnew () ؛ }}يمكن للرمز أعلاه حفظ الجلسة إلى redis. بالطبع ، هناك العديد من المشكلات ، مثل توليد SessionId ، والجلسة الماضية ، وتسلسل الكائن (يستخدم الاختبار سلسلة للراحة) ، والعديد من المشكلات الأخرى. سأقوم بتحسينه لاحقًا إذا كان لدي وقت.
لمزيد من المعلومات حول المحتوى المتعلق بـ Java ، يرجى مراجعة موضوعات هذا الموقع: "ملخص برمجة قاعدة بيانات Java+MySQL" ، "ملخص مهارات Java Excel" ، "Java Struct
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.