บทความนี้อธิบายการใช้งานง่าย ๆ ของการออมเซสชั่น Java เป็น Redis แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
ในการโหลดบาลานซ์หากผู้ใช้เข้าถึงเครื่องที่แตกต่างกันและไม่ได้ทำการซิงโครไนซ์เซสชันผู้ใช้จะถูกถามซึ่งไม่ดีมากสำหรับประสบการณ์ของผู้ใช้ดังนั้นจึงจำเป็นอย่างยิ่งที่เราจะต้องทำการซิงโครไนซ์เซสชัน ใส่เซสชันบนเซิร์ฟเวอร์แคช Reids สามารถแก้ปัญหาได้ดี ต่อไปนี้คือการใช้งานรหัสอย่างง่าย
1. กำหนดค่าตัวกรอง web.xml:
<sider> <filter-Name> SessionFilter </filter-name> <s Filter-Class> org.springframework.web.filter.delegatingFilterproxy </filter-class> </filter> <filter-mapping>
2. กำหนดค่าชื่อตัวกรองที่เกี่ยวข้อง:
<bean id = "sessionfilter"> <property name = "redistemplate" ref = "redistemplate"/> </ebean>
การใช้งาน SessionFilter:
SessionFilter คลาสสาธารณะขยาย GenericFilterBean {Redistemplate ส่วนตัว redistemplate ส่วนตัว; @Override โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ FilterChain) พ่น IOException, ServleTexception {System.out.println ("ตัวกรอง"); httpservletrequest re = (httpservletrequest) คำขอ; httpservletResponse res = (httpservletResponse) การตอบสนอง; terryhttpservletrequestwrapper wrapper = ใหม่ terryhttpservletrequestwrapper (RE, res, redistemplate); chain.dofilter (wrapper, การตอบสนอง); } สาธารณะ redistemplate getRedistemplate () {return redistemplate; } โมฆะสาธารณะ setredIstemplate (redistemplate redistemplate) {this.redistemplate = redistemplate; -4. การใช้งาน TerryhttpservletRequestWrapper:
ระดับสาธารณะ TerryhttpservletRequestWrapper ขยาย HttpServletRequestWrapper {เซสชัน cachehttpsession ส่วนตัว; การตอบสนอง HTTPSERVLETRESSESSIVE ส่วนตัว; redistemplate ส่วนตัว redistemplate; สาธารณะ terryhttpservletrequestwrapper (คำขอ httpservletrequest, การตอบกลับ httpservletResponse, redistemplate redistemplate) {super (คำขอ); this.edistemplate = การตอบสนอง; this.edistemplate = redistemplate; } @Override public httpsession getSession (boolean สร้าง) {ถ้า (เซสชัน! = null) {return session; } string sid = "terry" + system.currenttimeMillis (); Writesidtocookie (Sid); เซสชัน = ใหม่ cacheehttpsession (null, sid, redistemplate); เซสชั่นกลับ; } @Override public httpsession getSession () {return getSession (false); } void protected writeidtocookie (สตริง sid) {คุกกี้ mycookies = คุกกี้ใหม่ ("เทอร์รี่", sid); MyCookies.setMaxage (-1); MyCookies.SetDomain ("locahost"); MyCookies.SetPath ("/"); Response.addcookie (MyCookies); -5. การดำเนินการของ cacheehttpsession:
คลาสสาธารณะ cachehttpsession ขยาย httpsessionWrapper {สตริงส่วนตัว sid; redistemplate ส่วนตัว redistemplate; Private Stringredisserializer stringserializer = new Stringredisserializer (); cacheehttpsession สาธารณะ (เซสชัน httpsession, สตริง SID, redistemplate redistemplate) {super (เซสชัน); this.sid = sid; this.edistemplate = redistemplate; } @suppresswarnings ("ไม่ได้ตรวจสอบ") @Override การแจงนับสาธารณะ <String> getAttributeNames () {byte สุดท้าย [] key = stringserializer.serialize (SID); Object result = redistemplate.execute (ใหม่ rediscallback <jobch> () {@Override วัตถุสาธารณะ doinredis (การเชื่อมต่อ redisconnection) โยน dataAccessException {set <byte []> set = connection.keys (คีย์); 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 = เวกเตอร์ใหม่ (SS) .Elements (); return en; } return null; } @suppresswarnings ("ไม่ได้ตรวจสอบ") @Override โมฆะสาธารณะ setAttribute (ชื่อสตริง, ค่าวัตถุ) {สุดท้ายไบต์ [] key = stringserializer.serialize (ชื่อ); ไบต์สุดท้าย [] v = stringserializer.serialize ((สตริง) ค่า); redistemplate.execute (ใหม่ rediscallback <jobch> () {@Override วัตถุสาธารณะ doinredis (การเชื่อมต่อ redisconnection) โยน dataAccessException {connection.set (คีย์, v); return null;}}); } @Override วัตถุสาธารณะ getAttribute (ชื่อสตริง) {สุดท้ายไบต์ [] key = stringserializer.serialize (ชื่อ); @suppresswarnings ("ไม่ได้ตรวจสอบ") ค่าวัตถุ = redistemplate.execute (ใหม่ retiscallback <jobch> () {@Override วัตถุสาธารณะ doinredis (การเชื่อมต่อการเชื่อมต่อ redisconnection) โยน dataAccessException {return connection.get (key);}}); ค่าส่งคืน; } @Override สตริงสาธารณะ getId () {return sid; -6. การใช้งาน httpsessionWrapper:
ชั้นเรียนสาธารณะ httpsessionWrapper ใช้ httpsession {เซสชัน httpsession ส่วนตัว; สาธารณะ httpsessionWrapper (เซสชัน httpsession) {this.session = เซสชัน; } @Override สาธารณะ Long GetCreationTime () {return this.session.getCreationTime (); } @Override สตริงสาธารณะ getId () {return this.session.getId (); } @Override สาธารณะยาว getLaScessedTime () {return this.session.getLastaccessedTime (); } @Override สาธารณะ servletContext getServletContext () {return this.session.getServletContext (); } @Override โมฆะสาธารณะ setMaxInactiveInterval (ช่วงเวลา int) {this.session.setMaxInactiveInterval (ช่วงเวลา); } @Override สาธารณะ int getMaxinactiveInterval () {return this.session.getMaxinactiveInterval (); } @Override สาธารณะ httpsessionContext getSessionContext () {return this.session.getSessionContext (); } @Override วัตถุสาธารณะ getAttribute (ชื่อสตริง) {return this.session.getAttribute (ชื่อ); } @Override วัตถุสาธารณะ getValue (ชื่อสตริง) {return this.session.getValue (ชื่อ); } @Override การแจงนับสาธารณะ <String> getAttributeNames () {return this.session.getattributenames (); } @Override สตริงสาธารณะ [] getValuenames () {return this.session.getValuenames (); } @Override โมฆะสาธารณะ setAttribute (ชื่อสตริง, ค่าวัตถุ) {this.session.setAttribute (ชื่อ, ค่า); } @Override โมฆะสาธารณะ putValue (ชื่อสตริง, ค่าวัตถุ) {this.session.putValue (ชื่อ, ค่า); } @Override โมฆะสาธารณะ RemoveAttribute (ชื่อสตริง) {this.session.removeattribute (ชื่อ); } @Override โมฆะสาธารณะ removeValue (ชื่อสตริง) {this.session.removevalue (ชื่อ); } @Override โมฆะสาธารณะเป็นโมฆะ () {this.session.invalidate (); } @Override บูลีนสาธารณะ isnew () {return this.session.isnew (); -รหัสด้านบนสามารถบันทึกเซสชันเป็น Redis แน่นอนว่ามีปัญหามากมายเช่นการสร้าง SessionID, เซสชันที่ผ่านมา, การทำให้เป็นอนุกรมวัตถุ (การทดสอบใช้สตริงเพื่อความสะดวก) และปัญหาอื่น ๆ อีกมากมาย ฉันจะปรับปรุงในภายหลังถ้าฉันมีเวลา
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Java โปรดตรวจสอบหัวข้อของไซต์นี้: "สรุปการเขียนโปรแกรมฐานข้อมูล Java+MySQL", "การดำเนินการ Java Excel Summary Summary", "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "ไฟล์ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน