يتم إنشاء HttpSession وتدار من قبل حاوية بريمج، كما هي المخزنة القط / جيتي في الذاكرة. ولكن التطبيق لبناء مجموعة الموزعة، ومن ثم استخدام F5، LVS أو إنجن إكس للقيام الموازنة، ثم من المرجح أن يتم توزيع طلبات المتشعب من نفس المستخدم إلى عدد من ملقمات مختلفة. هذا السؤال هو، كيف لضمان أن ملقمات مختلفة لتبادل البيانات مع جلسة ذلك؟ أبسط الفكرة هي لحفظ بيانات الجلسة إلى مكان موحد آخرين من الذاكرة، مثل أعطها / رديس وقواعد البيانات الأخرى. هذا السؤال مرة أخرى، كيف ليحل محل تنفيذ HttpSession بريمج حاوية لإنشاء وإدارة ذلك؟
الخيار الأول: استخدام المكونات في وظائف توفير بريمج الحاويات، والعرف خلق HttpSession واستراتيجيات الإدارة، واستبدال النهج الافتراضي عن طريق التكوين. في الواقع، كانت هذه المنطقة منذ فترة طويلة مشروع مفتوح المصدر، مثل أعطها-الدورة مدير (يمكن الرجوع إلى الحمل المشتركة موازنة جلسة + (أعطها الدورة-مدير لتحقيق)، وهر-رديس-الدورة مدير. ومع ذلك، فإن هذا النهج لديه عيب، ويلزم قانون اقتران حاوية القط / جيتي بريمج مثل.
الخيار الثاني: تصميم تصفية، استخدم HttpServletRequestWrapper، وتحقيق طريقتهم getSession ()، للسيطرة على إنشاء وإدارة البيانات الدورة. ويتحقق الربيع الدورة هذا الخط من التفكير.
1، والدورة SC-رديس مشروع جديد، المقابلة لpom.xml الوثائق التالية
< XMLNS مشروع = " XMLNS: XSI = "
XSI: schemaLocation = " >
< modelVersion > 4.0.0 < / ModelVersion >
< groupId > الربيع سحابة < / GroupId >
< artifactId > SC-رديس الدورة < / ArtifactId >
< نص > 0.0.1 لقطة < / النسخة >
< التعبئة والتغليف > جرة < / تغليف >
< اسم > SC-رديس الدورة < / اسم >
< رابط > < / URL >
< أصل >
< groupId > org.springframework.boot < / GroupId >
< artifactId > الربيع التمهيد بداية الوالدين < / ArtifactId >
< نص > 2.0.4.RELEASE < / النسخة >
< / الرئيسي >
< dependencyManagement >
< تبعيات >
< التبعية >
< groupId > org.springframework.cloud < / GroupId >
< artifactId > الربيع سحابة تبعيات < / ArtifactId >
< نص > Finchley.RELEASE < / النسخة >
< نوع > بوم < / النوع >
< مجال > استيراد < / نطاق >
< / التبعية >
< / التبعيات >
< / DependencyManagement >
< خصائص >
< project.build.sourceEncoding > UTF-8 < /project.build.sourceEncoding >
< maven.compiler.source > 1.8 < /maven.compiler.source >
< maven.compiler.target > 1.8 < /maven.compiler.target >
< / خصائص >
< تبعيات >
< التبعية >
< groupId > org.springframework.boot < / GroupId >
< artifactId > ربيع التمهيد-بداية-بيانات رديس < / ArtifactId >
< / التبعية >
< التبعية >
< groupId > org.apache.commons < / GroupId >
< artifactId > المشاعات-pool2 هل < / ArtifactId >
< / التبعية >
< التبعية >
< groupId > org.springframework.boot < / GroupId >
< artifactId > الربيع التمهيد بداية على شبكة الإنترنت < / ArtifactId >
< / التبعية >
< التبعية >
< groupId > org.springframework.session < / GroupId >
< artifactId > الربيع الدورة بيانات رديس < / ArtifactId >
< / التبعية >
< التبعية >
< groupId > com.alibaba < / GroupId >
< artifactId > fastjson < / ArtifactId >
< نص > 1.2.49 < / النسخة >
< / التبعية >
< / التبعيات >
< / مشروع >
2، springboot الجديدة الطبقة بدء التشغيل RedisSessionApplication.java
حزمة com.redis.session.
استيراد org.springframework.boot.SpringApplication.
استيراد org.springframework.boot.autoconfigure.SpringBootApplication.
استيراد org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession.
SpringBootApplication
EnableRedisHttpSession
الطبقة العامة RedisSessionApplication {
ساكنة العام باطلة الرئيسية (سلسلة وسائط) {
SpringApplication.run (RedisSessionApplication.class، وسائط)؛
}
}
الوصف: الاستخدام الرئيسي للتوزيع EnableRedisHttpSession تعليق جلسة مفتوحة الربيع، يتم تكوين دور هذه الفئة لاعتراض طلب org.springframework.session.web.http.SessionRepositoryFilter
3، نيو الملف application.yml
الخادم:
المنفذ: 7200
الربيع:
الدورة:
متجر من نوع: رديس
التطبيق:
اسم: SC-رديس الدورة
رديس:
المضيف: 127.0.0.1
كلمة المرور:
المنفذ: 6379
مهلة: 10000 # وقت الاتصال (مللي ثانية)
قاعدة بيانات: 0 # رديس 16 شرائح الحالة الافتراضية، وهذا جزء تكوين معين المستخدمة، الافتراضي هو 0
الخس:
بركة:
ماكس النشطة: 8 # اتصال عدد أقصى تجمع اتصالات (سلبية تقدر أي حد) افتراضي 8
ماكس-الانتظار: -1 # تجمع الاتصال الكمون أقصى تسد (القيم السلبية أي حد) الافتراضية -1
ماكس الخمول: 8 # اتصال تجميع الاتصالات الأقصى الافتراضي الخمول 8
دقيقة الخمول: 0 # الحد الأدنى اتصالات تجمع الاتصال الخمول الافتراضية 0
4، وUserController جديدة، وتستخدم لمحاكاة تسجيل دخول المستخدم
حزمة com.redis.session.controller.
استيراد java.util.HashMap.
استيراد java.util.Map.
استيراد javax.servlet.http.Cookie.
استيراد javax.servlet.http.HttpServletRequest.
استيراد org.slf4j.Logger.
importorg.slf4j.LoggerFactory.
استيراد org.springframework.web.bind.annotation.RequestMapping.
استيراد org.springframework.web.bind.annotation.ResponseBody.
استيراد org.springframework.web.bind.annotation.RestController.
importcom.alibaba.fastjson.JSON.
importcom.redis.session.model.User.
RestController
الطبقة العامة UserController {
ساكنة الخاص المسجل النهائي مسجل = LoggerFactory.getLogger (UserController.class)؛
/ **
* عضو في الدورة
*
* طلبparam
*Return
* /
RequestMapping ( "المستخدم / / تسجيل الدخول")
ResponseBody
الجمهور خريطة < سلسلة، كائن > تسجيل الدخول (HttpServletRequest الطلب) {
// اسم المستخدم اتخذت في الجلسة
الكائن loginUser = request.getSession () getAttribute ( "loginUser")؛
إذا (loginUser == فارغة) {
logger.info ( "ليست الدورة الحالية، المستخدم ضبط")؛
العضو ش = العضو الجديد ()؛
u.setAge (23)؛
u.setId (1L)؛
u.setPosition ( "الرئيس")؛
u.setUserName ( "huangjinjin")؛
. Request.getSession () على SetAttribute ( "loginUser"، ش)؛
} {شيء آخر
logger.info ( "الحاضر الدورة، المستخدم =" + JSON.toJSONString (loginUser))؛
}
كوكي الكوكيز = request.getCookies ()؛
إذا (الكوكيز! = فارغة && cookies.length > 0) {
ل(كوكي كوكي: الكوكيز) {
logger.info (cookie.getName () + ":" + cookie.getValue ())؛
}
}
خريطة < سلسلة، كائن > التركيب = HashMap جديد < سلسلة، كائن > ()؛
resp.put ( "كود"، "000000")؛
resp.put ( "جي اس"، "صفقة ناجحة")؛
returnresp.
}
/ **
* احصل على مستخدمي الدورة.
*
* طلبparam
*Return
* /
RequestMapping ( "المستخدم / / getUser")
ResponseBody
الجمهور خريطة < سلسلة، كائن > getUser (HttpServletRequest الطلب) {
خريطة < سلسلة، كائن > التركيب = HashMap جديد < سلسلة، كائن > ()؛
resp.put ( "كود"، "000000")؛
resp.put ( "جي اس"، "صفقة ناجحة")؛
resp.put ( "الهيئة"، request.getSession () getAttribute ( "loginUser"))؛
كوكي الكوكيز = request.getCookies ()؛
إذا (الكوكيز! = فارغة && cookies.length > 0) {
ل(كوكي كوكي: الكوكيز) {
logger.info (cookie.getName () + ":" + cookie.getValue ())؛
}
}
returnresp.
}
}
5، بدء المشروع، عرض سجل إطلاق OK
6، والوصول باستخدام جوجل واجهة متصفح
واجهة تسجيل الدخول بأول زيارة: HTTP: //127.0.0.1: 7200 / المستخدم / تسجيل الدخول
طباعة وحدة التحكم:
الثانية إلى n-عشر: وحدة التحكم طباعة
الحصول على جلسة واجهة الوصول: المستخدم إرجاع البيانات المطابقة
7، عرض خدمة البيانات من خلال ريدس رديس العميل رديس-المبادرة القطرية