| ³¤ÆÚÒÔÀ´£¬session¹ÜÀí¾ÍÊÇÆóÒµ¼¶JavaÖеÄÒ»²¿·Ö£¬ÒÔÖÂÓÚÎÒÃÇDZÒâʶ¾ÍÈÏΪËüÊÇÒѾ½â¾öµÄÎÊÌ⣬ÔÚ×î½üµÄ¼ÇÒäÖУ¬ÎÒÃÇûÓп´µ½Õâ¸öÁìÓòÓкܴóµÄ¸ïС£ µ«ÊÇ£¬ÏÖ´úµÄÇ÷ÊÆÊÇ΢·þÎñÒÔ¼°¿ÉˮƽÀ©Õ¹µÄÔÉúÔÆÓ¦Óã¨cloud native 
                          application£©£¬ËüÃÇ»áÌôÕ½¹ýÈ¥20¶àÄêÀ´ÎÒÃÇÉè¼ÆºÍ¹¹½¨session¹ÜÀíÆ÷ʱµÄǰÌá¼ÙÉ裬²¢ÇÒ±©Â¶ÁËÏÖ´ú»¯session¹ÜÀíÆ÷µÄ²»×ã¡£ ±¾ÎĽ«»á²ûÊö×î½ü·¢²¼µÄSpring Session APIÈçºÎ°ïÖúÎÒÃǿ˷þÑÛÏÂsession¹ÜÀí·½Ê½ÖеÄһЩ²»×㣬ÔÚÆóÒµ¼¶JavaÖУ¬´«Í³É϶¼»á²ÉÓÃÕâÖ־ɵķ½Ê½¡£ÎÒÃÇÊ×ÏÈ»á¼òµ¥²ûÊöһϵ±Ç°session¹ÜÀíÖеÄÎÊÌ⣬ȻºóÉîÈë½éÉÜSpring 
                          SessionÊÇÈçºÎ½â¾öÕâЩÎÊÌâµÄ¡£ÔÚÎÄÕµÄ×îºó£¬½«»áÏêϸչʾSpring SessionÊÇÈçºÎÔËÐеģ¬ÒÔ¼°ÔÚÏîÄ¿ÖÐÔõÑùʹÓÃËü¡£ Spring SessionΪÆóÒµ¼¶JavaÓ¦ÓõÄsession¹ÜÀí´øÀ´Á˸ïУ¬Ê¹µÃÒÔÏµĹ¦Äܸü¼ÓÈÝÒ×ʵÏÖ£º ±àд¿ÉˮƽÀ©Õ¹µÄÔÉúÔÆÓ¦Óᣠ ½«sessionËù±£´æµÄ×´Ì¬Ð¶ÔØµ½Ìض¨µÄÍⲿsession´æ´¢ÖУ¬ÈçRedis»òApache 
                          GeodeÖУ¬ËüÃÇÄܹ»ÒÔ¶ÀÁ¢ÓÚÓ¦Ó÷þÎñÆ÷µÄ·½Ê½Ìṩ¸ßÖÊÁ¿µÄ¼¯Èº¡£  µ±Óû§Ê¹ÓÃWebSocket·¢ËÍÇëÇóµÄʱºò£¬Äܹ»±£³ÖHttpSession´¦ÓÚ»îԾ״̬¡£ 
                         ÔÚ·ÇWebÇëÇóµÄ´¦Àí´úÂëÖУ¬Äܹ»·ÃÎÊsessionÊý¾Ý£¬±ÈÈçÔÚJMSÏûÏ¢µÄ´¦Àí´úÂëÖС£ 
                         Ö§³Öÿ¸öä¯ÀÀÆ÷ÉÏʹÓöà¸ösession£¬´Ó¶øÄܹ»ºÜÈÝÒ׵ع¹½¨¸ü¼Ó·á¸»µÄÖÕ¶ËÓû§ÌåÑé¡£ 
                         ¿ØÖÆsession idÈçºÎÔÚ¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼ä½øÐн»»»£¬ÕâÑùµÄ»°¾ÍÄܺÜÈÝÒ׵رàдRestful 
                          API£¬ÒòΪËü¿ÉÒÔ´ÓHTTP Í·ÐÅÏ¢ÖлñÈ¡session id£¬¶ø²»±ØÔÙÒÀÀµÓÚcookie¡£  ÐèҪ˵Ã÷µÄºÜÖØÒªµÄÒ»µã¾ÍÊÇ£¬Spring SessionµÄºËÐÄÏîÄ¿²¢²»ÒÀÀµÓÚSpring¿ò¼Ü£¬ËùÒÔ£¬ÎÒÃÇÉõÖÁÄܹ»½«ÆäÓ¦ÓÃÓÚ²»Ê¹ÓÃSpring¿ò¼ÜµÄÏîÄ¿ÖС£ ´«Í³session¹ÜÀíµÄÎÊÌâ ´«Í³µÄJavaEE session¹ÜÀí»áÓи÷ÖÖÎÊÌ⣬ÕâÇ¡ºÃÊÇSpring 
                          SessionËùÒªÊÔͼ½â¾öµÄ¡£ÕâЩÎÊÌâÔÚÏÂÃæÒÔÑùÀýµÄÐÎʽ½øÐÐÁ˲ûÊö¡£ ¹¹½¨¿ÉˮƽÀ©Õ¹µÄÔÉúÔÆÓ¦Óà ÔÚÔÉúµÄÔÆÓ¦Óüܹ¹ÖУ¬»á¼ÙÉèÓ¦ÓÃÄܹ»½øÐÐÀ©Õ¹£¬ÕâÊÇͨ¹ýÔÚLinuxÈÝÆ÷ÖÐÔËÐиü¶àµÄÓ¦ÓóÌÐòʵÀýʵÏֵģ¬ÕâЩÈÝÆ÷»áλÓÚÒ»¸ö´óÐ͵ÄÐéÄâ»ú³ØÖС£ÀýÈ磬ÎÒÃÇ¿ÉÒÔºÜÈÝÒ׵ؽ«Ò»¸ö¡°.war¡±Îļþ²¿Êðµ½Î»ÓÚCloud 
                          Foundry»òHerokuµÄTomcatÖУ¬È»ºóÔÚ¼¸ÃëÖÓµÄʱ¼äÄÚ¾ÍÄÜÀ©Õ¹µ½100¸öÓ¦ÓÃʵÀý£¬Ã¿¸öʵÀý¿ÉÒÔ¾ßÓÐ1GB 
                          RAM¡£ÎÒÃÇ»¹¿ÉÒÔÅäÖÃÔÆÆ½Ì¨£¬»ùÓÚÓû§µÄÐèÇó×Ô¶¯Ôö¼ÓºÍ¼õÉÙÓ¦ÓÃʵÀýµÄÊýÁ¿¡£ ÔںܶàµÄÓ¦Ó÷þÎñÆ÷ÖУ¬¶¼»á½«HTTP session״̬±£´æÔÚJVMÖУ¬Õâ¸öJVMÓëÔËÐÐÓ¦ÓóÌÐò´úÂëµÄJVMÊÇͬһ¸ö£¬ÒòΪÕâÑùÒ×ÓÚʵÏÖ£¬²¢ÇÒËٶȺܿ졣µ±ÐµÄÓ¦Ó÷þÎñÆ÷ʵÀý¼ÓÈë»òÀ뿪¼¯ÈºÊ±£¬HTTP 
                          session»á»ùÓÚÏÖÓеÄÓ¦Ó÷þÎñÆ÷ʵÀý½øÐÐÖØÐÂÆ½ºâ¡£ÔÚµ¯ÐÔµÄÔÆ»·¾³ÖУ¬ÎÒÃÇ»áÓµÓÐÉϰٸöÓ¦Ó÷þÎñÆ÷ʵÀý£¬²¢ÇÒʵÀýµÄÊýÁ¿¿ÉÄÜÔÚÈÎÒâʱ¿ÌÔö¼Ó»ò¼õÉÙ£¬ÕâÑùµÄ»°£¬ÎÒÃǾͻáÓöµ½Ò»Ð©ÎÊÌ⣺ 
                         ÖØÆ½ºâHTTP session¿ÉÄÜ»á³ÉΪÐÔÄÜÆ¿¾±¡£  ΪÁË´æ´¢´óÁ¿µÄsession£¬»áÐèÒªºÜ´óµÄ¶Ñ¿Õ¼ä£¬Õâ»áµ¼ÖÂÀ¬»øÊÕ¼¯£¬´Ó¶ø¶ÔÐÔÄܲúÉú¸ºÃæÓ°Ïì¡£ 
                         ÔÆ»ù´¡Éèʩͨ³£»á½ûÖ¹TCP¶à²¥£¨multicast£©£¬µ«ÊÇsession¹ÜÀíÆ÷³£³£»áʹÓÃÕâÖÖ»úÖÆÀ´·¢ÏÖÄÄÒ»¸öÓ¦Ó÷þÎñÆ÷ʵÀý¼ÓÈë»òÀ뿪Á˼¯Èº¡£ 
                         Òò´Ë£¬¸üΪ¸ßЧµÄ°ì·¨Êǽ«HTTP session״̬±£´æÔÚ¶ÀÁ¢µÄÊý¾Ý´æ´¢ÖУ¬Õâ¸ö´æ´¢Î»ÓÚÔËÐÐÓ¦ÓóÌÐò´úÂëµÄJVMÖ®Íâ¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔ½«100¸öTomcatʵÀýÅäÖÃΪʹÓÃRedisÀ´´æ´¢session״̬£¬µ±TomcatʵÀýÔö¼Ó»ò¼õÉÙµÄʱºò£¬RedisÖÐËù´æ´¢µÄsession²¢²»»áÊܵ½Ó°Ï졣ͬʱ£¬ÒòΪRedisÊÇʹÓÃCÓïÑÔ±àдµÄ£¬ËùÒÔËü¿ÉÒÔʹÓÃÉϰÙGBÉõÖÁTB¼¶±ðµÄRAM£¬Ëü²»»áÉæ¼°µ½À¬»øÊÕ¼¯µÄÎÊÌâ¡£ ¶ÔÓÚÏñTomcatÕâÑùµÄ¿ªÔ´·þÎñÆ÷£¬ºÜÈÝÒ×ÕÒµ½session¹ÜÀíÆ÷µÄÌæ´ú·½°¸£¬ÕâÐ©Ìæ´ú·½°¸¿ÉÒÔʹÓÃÍⲿµÄÊý¾Ý´æ´¢£¬ÈçRedis»òMemcached¡£µ«ÊÇ£¬ÕâЩÅäÖùý³Ì¿ÉÄÜ»á±È½Ï¸´ÔÓ£¬¶øÇÒÿÖÖÓ¦Ó÷þÎñÆ÷¶¼ÓÐËù²î±ð¡£¶ÔÓÚ±ÕÔ´µÄ²úÆ·£¬ÈçWebSphereºÍWeblogic£¬Ñ°ÕÒËüÃǵÄsession¹ÜÀíÆ÷Ìæ´ú·½°¸²»½ö·Ç³£À§ÄÑ£¬ÔÚÓÐЩʱºò£¬ÉõÖÁÊÇÎÞ·¨ÊµÏֵġ£ Spring SessionÌṩÁËÒ»ÖÖ¶ÀÁ¢ÓÚÓ¦Ó÷þÎñÆ÷µÄ·½°¸£¬ÕâÖÖ·½°¸Äܹ»ÔÚServlet¹æ·¶Ö®ÄÚÅäÖÿɲå°ÎµÄsessionÊý¾Ý´æ´¢£¬²»ÒÀÀµÓÚÈκÎÓ¦Ó÷þÎñÆ÷µÄÌØ¶¨API¡£Õâ¾ÍÒâζ×ÅSpring 
                          SessionÄܹ»ÓÃÓÚʵÏÖÁËservlet¹æ·¶µÄËùÓÐÓ¦Ó÷þÎñÆ÷Ö®ÖУ¨Tomcat¡¢Jetty¡¢ WebSphere¡¢WebLogic¡¢JBossµÈ£©£¬ËüÄܹ»·Ç³£±ãÀûµØÔÚËùÓÐÓ¦Ó÷þÎñÆ÷ÖÐÒÔÍêÈ«ÏàͬµÄ·½Ê½½øÐÐÅäÖá£ÎÒÃÇ»¹¿ÉÒÔÑ¡ÔñÈÎÒâ×îÊÊÓ¦ÐèÇóµÄÍⲿsessionÊý¾Ý´æ´¢¡£ÕâʹµÃSpring 
                          Session³ÉΪһ¸öºÜÀíÏëµÄÇ¨ÒÆ¹¤¾ß£¬°ïÖúÎÒÃǽ«´«Í³µÄJavaEEÓ¦ÓÃ×ªÒÆµ½ÔÆÖУ¬Ê¹Æä³ÉΪÂú×ã 12-factorµÄÓ¦Óᣠÿ¸öÓû§Óжà¸öÕ˺мÙÉèÎÒÃÇÔÚexample.comÉÏÔËÐÐÃæÏò¹«ÖÚµÄWebÓ¦Óã¬ÔÚÕâ¸öÓ¦ÓÃÖÐÓÐЩÓû§»á´´½¨¶à¸öÕ˺š£ÀýÈ磬Óû§Jeff 
                          Lebowski¿ÉÄÜ»áÓÐÁ½¸öÕË»§thedude@example.comºÍlebowski@example.com¡£ºÍÆäËûJava 
                          WebÓ¦ÓÃÒ»Ñù£¬ÎÒÃÇ»áʹÓÃHttpSessionÀ´¸ú×ÙÓ¦ÓõÄ״̬£¬È統ǰµÇ¼µÄÓû§¡£ËùÒÔ£¬µ±Óû§Ï£Íû´Óthedude@example.comÇл»µ½lebowski@example.comʱ£¬Ëû±ØÐëÒªÊ×ÏÈÍ˳ö£¬È»ºóÔÙÖØÐµÇ¼»ØÀ´¡£ ½èÖúSpring Session£¬ÎªÃ¿¸öÓû§ÅäÖöà¸öHTTP session»á·Ç³£ÈÝÒ×£¬ÕâÑùÓû§ÔÚthedude@example.comºÍlebowski@example.comÖ®¼äÇл»µÄʱºò£¬¾Í²»ÐèÒªÍ˳öºÍÖØÐµÇ¼ÁË¡£ ¶à¼¶±ðµÄ°²È«Ô¤ÀÀ ¼ÙÉèÎÒÃÇÕýÔÚ¹¹½¨µÄWebÓ¦ÓÃÓÐÒ»¸ö¸´ÔÓ¡¢×Ô¶¨ÒåµÄȨÏÞ¹¦ÄÜ£¬ÆäÖÐÓ¦ÓõÄUI»á»ùÓÚÓû§ËùÊÚÓèµÄ½ÇÉ«ºÍȨÏÞʵÏÖ×ÔÊÊÓ¦¡£ ÀýÈ磬¼ÙÉèÓ¦ÓÃÓÐËĸö°²È«¼¶±ð£ºpublic¡¢confidential¡¢secretºÍtop 
                          secret¡£µ±Óû§µÇ¼ӦÓÃÖ®ºó£¬ÏµÍ³»áÅжÏÓû§Ëù¾ßÓеÄ×î¸ß°²È«¼¶±ð²¢ÇÒÖ»»áÏÔʾ¸Ã¼¶±ðºÍ¸Ã¼¶±ð֮ϵÄÊý¾Ý¡£ËùÒÔ£¬¾ßÓÐpublicȨÏÞµÄÓû§Ö»ÄÜ¿´µ½public¼¶±ðµÄÎĵµ£¬¾ßÓÐsecretȨÏÞµÄÓû§Äܹ»¿´µ½public¡¢confidentialºÍsecret¼¶±ðµÄÎĵµ£¬ÖîÈç´ËÀࡣΪÁ˱£Ö¤Óû§½çÃæ¸ü¼ÓÓѺã¬Ó¦ÓóÌÐòÓ¦¸ÃÔÊÐíÓû§Ô¤ÀÀÔڽϵ͵ݲȫ¼¶±ðÌõ¼þÏÂÒ³ÃæÊÇʲôÑù×ӵġ£ÀýÈ磬top 
                          secretȨÏÞµÄÓû§Äܹ»½«Ó¦ÓôÓtop secretģʽÇл»µ½secretģʽ£¬ÕâÑù¾ÍÄÜÕ¾ÔÚ¾ßÓÐsecretȨÏÞÓû§µÄÊÓ½ÇÉÏ£¬²é¿´Ó¦ÓÃÊÇʲôÑù×ӵġ£ µäÐ͵ÄWebÓ¦ÓûὫµ±Ç°Óû§µÄ±êʶ¼°Æä½ÇÉ«±£´æÔÚHTTP sessionÖУ¬µ«ÒòΪÔÚWebÓ¦ÓÃÖУ¬Ã¿¸öµÇ¼µÄÓû§Ö»ÄÜÓÐÒ»¸ösession£¬Òò´Ë³ýÁËÓû§Í˳ö²¢ÖØÐµÇ¼½øÀ´£¬ÎÒÃDz¢Ã»Óа취ÔÚ½Çɫ֮¼ä½øÐÐÇл»£¬³ý·ÇÎÒÃÇΪÿ¸öÓû§×ÔÐÐʵÏÖ¶à¸ösessionµÄ¹¦ÄÜ¡£ ½èÖúSpring Session£¬¿ÉÒÔºÜÈÝÒ×µØÎªÃ¿¸öµÇ¼Óû§´´½¨¶à¸ösession£¬ÕâЩsessionÖ®¼äÊÇÍêÈ«¶ÀÁ¢µÄ£¬Òò´ËʵÏÖÉÏÊöµÄÔ¤ÀÀ¹¦ÄÜÊǷdz£ÈÝÒ׵ġ£ÀýÈ磬µ±Ç°Óû§ÒÔtop 
                          secret½ÇÉ«½øÐÐÁ˵Ǽ£¬ÄÇôӦÓÿÉÒÔ´´½¨Ò»¸öеÄsession£¬Õâ¸ösessionµÄ×î¸ß°²È«½ÇÉ«ÊÇsecret¶ø²»ÊÇtop 
                          secret£¬ÕâÑùµÄ»°£¬Óû§¾Í¿ÉÒÔÔÚsecretģʽԤÀÀÓ¦ÓÃÁË¡£ µ±Ê¹ÓÃWeb SocketµÄʱºò±£³ÖµÇ¼״̬ ¼ÙÉèÓû§µÇ¼ÁËexample.comÉϵÄWebÓ¦Óã¬ÄÇôËûÃÇ¿ÉÒÔʹÓÃHTML5µÄchat¿Í»§¶ËʵÏÖÁÄÌìµÄ¹¦ÄÜ£¬Õâ¸ö¿Í»§¶Ë¹¹½¨ÔÚwebsocketÖ®ÉÏ¡£°´ÕÕservlet¹æ·¶£¬Í¨¹ýwebsocket´«ÈëµÄÇëÇó²¢²»Äܱ£³ÖHTTP 
                          session´¦ÓÚ»îԾ״̬£¬ËùÒÔµ±Óû§ÔÚÁÄÌìµÄ¹ý³ÌÖУ¬HTTP sessionµÄµ¹Êý¼ÆÊ±Æ÷»áÔÚ²»¶ÏµØÁ÷ÊÅ¡£¼´±ãÕ¾ÔÚÓû§µÄÁ¢³¡ÉÏ£¬ËûÃÇÒ»Ö±ÔÚʹÓÃÓ¦ÓóÌÐò£¬HTTP 
                          session×îÖÕÒ²¿ÉÄÜ»á³öÏÖ¹ýÆÚ¡£µ±HTTP session¹ýÆÚʱ£¬websocketÁ¬½Ó½«»á¹Ø±Õ¡£ 
                         ½èÖúSpring Session£¬¶ÔÓÚϵͳÖеÄÓû§£¬ÎÒÃÇÄܹ»ºÜÈÝÒ×µØÊµÏÖwebsocketÇëÇóºÍ³£¹æµÄHTTPÇëÇó¶¼Äܱ£³ÖHTTP 
                          session´¦ÓÚ»îԾ״̬¡£ ·ÇWebÇëÇó·ÃÎÊSessionÊý¾Ý ¼ÙÉèÎÒÃǵÄÓ¦ÓÃÌṩÁËÁ½ÖÖ·ÃÎÊ·½Ê½£ºÒ»ÖÖʹÓûùÓÚHTTPµÄREST API£¬¶øÁíÒ»ÖÖʹÓûùÓÚRabbitMQµÄAMQPÏûÏ¢¡£Ö´ÐÐÏûÏ¢´¦Àí´úÂëµÄÏ߳̽«ÎÞ·¨·ÃÎÊÓ¦Ó÷þÎñÆ÷µÄHttpSession£¬ËùÒÔÎÒÃDZØÐëÒªÒÔÒ»ÖÖ×Ô¶¨ÒåµÄ·½°¸À´»ñÈ¡HTTP 
                          sessionÖеÄÊý¾Ý£¬ÕâҪͨ¹ý×Ô¶¨ÒåµÄ»úÖÆÀ´ÊµÏÖ¡£ ͨ¹ýʹÓÃSpring Session£¬Ö»ÒªÎÒÃÇÄܹ»ÖªµÀsessionµÄid£¬¾Í¿ÉÒÔÔÚÓ¦ÓõÄÈÎÒâÏß³ÌÖзÃÎÊSpring 
                          Session¡£Òò´Ë£¬Spring Session¾ß±¸±ÈServlet HTTP session¹ÜÀíÆ÷¸üΪ·á¸»µÄAPI£¬Ö»ÒªÖªµÀÁËsession 
                          id£¬ÎÒÃǾÍÄÜ»ñÈ¡ÈÎÒâÌØ¶¨µÄsession¡£ÀýÈ磬ÔÚÒ»¸ö´«ÈëµÄÏûÏ¢ÖпÉÄÜ»á°üº¬Óû§idµÄheaderÐÅÏ¢£¬½èÖúËü£¬ÎÒÃǾͿÉÒÔÖ±½Ó»ñÈ¡sessionÁË¡£ Spring SessionÊÇÈçºÎÔËÐÐµÄ ÎÒÃÇÒѾÌÖÂÛÁËÔÚ´«Í³µÄÓ¦Ó÷þÎñÆ÷ÖУ¬HTTP session¹ÜÀí´æÔÚ²»×ãµÄ¸÷ÖÖ³¡¾°£¬½ÓÏÂÀ´¿´Ò»ÏÂSpring 
                          SessionÊÇÈçºÎ½â¾öÕâЩÎÊÌâµÄ¡£  Spring SessionµÄ¼Ü¹¹ µ±ÊµÏÖsession¹ÜÀíÆ÷µÄʱºò£¬ÓÐÁ½¸ö±ØÐëÒª½â¾öµÄºËÐÄÎÊÌâ¡£Ê×ÏÈ£¬ÈçºÎ´´½¨¼¯Èº»·¾³Ï¸߿ÉÓõÄsession£¬ÒªÇóÄܹ»¿É¿¿²¢¸ßЧµØ´æ´¢Êý¾Ý¡£Æä´Î£¬²»¹ÜÇëÇóÊÇHTTP¡¢WebSocket¡¢AMQP»¹ÊÇÆäËûµÄÐÒ飬¶ÔÓÚ´«ÈëµÄÇëÇó¸ÃÈçºÎÈ·¶¨¸ÃÓÃÄĸösessionʵÀý¡£ÊµÖÊÉÏ£¬¹Ø¼üÎÊÌâÔÚÓÚ£ºÔÚ·¢ÆðÇëÇóµÄÐÒéÉÏ£¬session 
                          id¸ÃÈçºÎ½øÐд«Ê䣿 Spring SessionÈÏΪµÚÒ»¸öÎÊÌ⣬Ҳ¾ÍÊÇÔڸ߿ÉÓÿÉÀ©Õ¹µÄ¼¯ÈºÖд洢Êý¾ÝÒѾͨ¹ý¸÷ÖÖÊý¾Ý´æ´¢·½°¸µÃµ½Á˽â¾ö£¬ÈçRedis¡¢GemFireÒÔ¼°Apache 
                          GeodeµÈµÈ£¬Òò´Ë£¬Spring Session¶¨ÒåÁËÒ»×é±ê×¼µÄ½Ó¿Ú£¬¿ÉÒÔͨ¹ýʵÏÖÕâЩ½Ó¿Ú¼ä½Ó·ÃÎʵײãµÄÊý¾Ý´æ´¢¡£Spring 
                          Session¶¨ÒåÁËÈçϺËÐĽӿڣºSession¡¢ExpiringSessionÒÔ¼°SessionRepository£¬Õë¶Ô²»Í¬µÄÊý¾Ý´æ´¢£¬ËüÃÇÐèÒª·Ö±ðʵÏÖ¡£ org.springframework.session.Session½Ó¿Ú¶¨ÒåÁËsessionµÄ»ù±¾¹¦ÄÜ£¬ÈçÉèÖúÍÒÆ³ýÊôÐÔ¡£Õâ¸ö½Ó¿Ú²¢²»¹ØÐĵײ㼼Êõ£¬Òò´ËÄܹ»±Èservlet 
                          HttpSessionÊÊÓÃÓÚ¸üΪ¹ã·ºµÄ³¡¾°ÖС£  org.springframework.session.ExpiringSessionÀ©Õ¹ÁËSession½Ó¿Ú£¬ËüÌṩÁËÅжÏsessionÊÇ·ñ¹ýÆÚµÄÊôÐÔ¡£RedisSessionÊÇÕâ¸ö½Ó¿ÚµÄÒ»¸öÑùÀýʵÏÖ¡£ 
                         org.springframework.session.SessionRepository¶¨ÒåÁË´´½¨¡¢±£´æ¡¢É¾³ýÒÔ¼°¼ìË÷sessionµÄ·½·¨¡£½«SessionʵÀýÕæÕý±£´æµ½Êý¾Ý´æ´¢µÄÂß¼ÊÇÔÚÕâ¸ö½Ó¿ÚµÄʵÏÖÖбàÂëÍê³ÉµÄ¡£ÀýÈ磬RedisOperationsSessionRepository¾ÍÊÇÕâ¸ö½Ó¿ÚµÄÒ»¸öʵÏÖ£¬Ëü»áÔÚRedisÖд´½¨¡¢´æ´¢ºÍɾ³ýsession¡£ 
                         Spring SessionÈÏΪ½«ÇëÇóÓëÌØ¶¨µÄsessionʵÀý¹ØÁªÆðÀ´µÄÎÊÌâÊÇÓëÐÒéÏà¹ØµÄ£¬ÒòΪÔÚÇëÇó/ÏìÓ¦ÖÜÆÚÖУ¬¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼äÐèÒªÐÉÌͬÒâÒ»ÖÖ´«µÝsession 
                          idµÄ·½Ê½¡£ÀýÈ磬Èç¹ûÇëÇóÊÇͨ¹ýHTTP´«µÝ½øÀ´µÄ£¬ÄÇôsession¿ÉÒÔͨ¹ýHTTP cookie»òHTTP 
                          HeaderÐÅÏ¢ÓëÇëÇó½øÐйØÁª¡£Èç¹ûʹÓÃHTTPSµÄ»°£¬ÄÇô¿ÉÒÔ½èÖúSSL session idʵÏÖÇëÇóÓësessionµÄ¹ØÁª¡£Èç¹ûʹÓÃJMSµÄ»°£¬ÄÇôJMSµÄHeaderÐÅÏ¢Äܹ»ÓÃÀ´´æ´¢ÇëÇóºÍÏìÓ¦Ö®¼äµÄsession 
                          id¡£ ¶ÔÓÚHTTPÐÒéÀ´Ëµ£¬Spring Session¶¨ÒåÁËHttpSessionStrategy½Ó¿ÚÒÔ¼°Á½¸öĬÈÏʵÏÖ£¬¼´CookieHttpSessionStrategyºÍHeaderHttpSessionStrategy£¬ÆäÖÐǰÕßʹÓÃHTTP 
                          cookie½«ÇëÇóÓësession id¹ØÁª£¬¶øºóÕßʹÓÃHTTP header½«ÇëÇóÓësession¹ØÁª¡£ ÈçϵÄÕ½ÚÏêϸ²ûÊöÁËSpring SessionʹÓÃHTTPÐÒéµÄϸ½Ú¡£ ÔÚ׫д±¾ÎĵÄʱºò£¬ÔÚµ±Ç°µÄSpring Session 1.0.2 GA·¢²¼°æ±¾ÖУ¬°üº¬ÁËSpring 
                          SessionʹÓÃRedisµÄʵÏÖ£¬ÒÔ¼°»ùÓÚMapµÄʵÏÖ£¬Õâ¸öʵÏÖÖ§³ÖÈÎÒâµÄ·Ö²¼Ê½Map£¬ÈçHazelcast¡£ÈÃSpring 
                          SessionÖ§³ÖijÖÖÊý¾Ý´æ´¢ÊÇÏ൱ÈÝÒ׵ģ¬ÏÖÔÚÓÐÖ§³Ö¸÷ÖÖÊý¾Ý´æ´¢µÄÉçÇøÊµÏÖ¡£ Spring Session¶ÔHTTPµÄÖ§³Ö Spring Session¶ÔHTTPµÄÖ§³ÖÊÇͨ¹ý±ê×¼µÄservlet 
                          filterÀ´ÊµÏֵģ¬Õâ¸öfilter±ØÐëÒªÅäÖÃΪÀ¹½ØËùÓеÄwebÓ¦ÓÃÇëÇ󣬲¢ÇÒËüÓ¦¸ÃÊÇfilterÁ´ÖеĵÚÒ»¸öfilter¡£Spring 
                          Session filter»áÈ·±£Ëæºóµ÷ÓÃjavax.servlet.http.HttpServletRequestµÄgetSession()·½·¨Ê±£¬¶¼»á·µ»ØSpring 
                          SessionµÄHttpSessionʵÀý£¬¶ø²»ÊÇÓ¦Ó÷þÎñÆ÷ĬÈϵÄHttpSession¡£ Èç¹ûÒªÀí½âËüµÄ»°£¬×î¼òµ¥µÄ·½Ê½¾ÍÊDz鿴Spring Sessionʵ¼ÊËùʹÓõÄÔ´Âë¡£Ê×ÏÈ£¬ÎÒÃÇÁ˽âһϱê×¼servletÀ©Õ¹µãµÄһЩ±³¾°ÖªÊ¶£¬ÔÚʵÏÖSpring 
                          SessionµÄʱºò»áʹÓÃÕâЩ֪ʶ¡£ ÔÚ2001Ä꣬Servlet 2.3¹æ·¶ÒýÈëÁËServletRequestWrapper¡£ËüµÄjavadocÎĵµÕâÑùдµÀ£¬ServletRequestWrapper¡°ÌṩÁËServletRequest½Ó¿ÚµÄ±ãÀûʵÏÖ£¬¿ª·¢ÈËÔ±Èç¹ûÏ£Íû½«ÇëÇóÊÊÅäµ½ServletµÄ»°£¬¿ÉÒÔ±àдËüµÄ×ÓÀà¡£Õâ¸öÀàʵÏÖÁ˰ü×°£¨Wrapper£©»òÕß˵ÊÇ×°ÊΣ¨Decorator£©Ä£Ê½¡£¶Ô·½·¨µÄµ÷ÓÃĬÈÏ»áͨ¹ý°ü×°µÄÇëÇó¶ÔÏóÀ´Ö´ÐС±¡£ÈçϵĴúÂëÑùÀý³éÈ¡×ÔTomcat£¬Õ¹ÏÖÁËServletRequestWrapperÊÇÈçºÎʵÏֵġ£ 
                           
                            | public class ServletRequestWrapper implements ServletRequest { private ServletRequest request;  /*** ´´½¨ServletRequestÊÊÅäÆ÷£¬Ëü°ü×°Á˸ø¶¨µÄÇëÇó¶ÔÏó¡£
 * @throws java.lang.IllegalArgumentException if 
                                the request is null
 */
 public ServletRequestWrapper(ServletRequest request) 
                                {
 if (request == null) {
 throw new IllegalArgumentException("Request 
                                cannot be null");
 }
 this.request = request;
 }
  public ServletRequest getRequest() {return this.request;
 }
 
 public Object getAttribute(String name) {
 return this.request.getAttribute(name);
 }
  // ΪÁ˱£Ö¤¿É¶ÁÐÔ£¬ÆäËûµÄ·½·¨É¾¼õµôÁË }
 
 |  Servlet 2.3¹æ·¶»¹¶¨ÒåÁËHttpServletRequestWrapper£¬ËüÊÇServletRequestWrapperµÄ×ÓÀ࣬Äܹ»¿ìËÙÌṩHttpServletRequestµÄ×Ô¶¨ÒåʵÏÖ£¬ÈçϵĴúÂëÊÇ´ÓTomcat³éÈ¡³öÀ´µÄ£¬Õ¹ÏÖÁËHttpServletRequesWrapperÀàÊÇÈçºÎÔËÐеġ£ 
                           
                            | public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest {
  public HttpServletRequestWrapper(HttpServletRequest 
                                request) {super(request);
 }
 
 private HttpServletRequest _getHttpServletRequest() 
                                {
 return (HttpServletRequest) super.getRequest();
 }
 
 public HttpSession getSession(boolean create) 
                                {
 return this._getHttpServletRequest().getSession(create);
 }
 
 public HttpSession getSession() {
 return this._getHttpServletRequest().getSession();
 }
 // ΪÁ˱£Ö¤¿É¶ÁÐÔ£¬ÆäËûµÄ·½·¨É¾¼õµôÁË
 }
 
 |  ËùÒÔ£¬½èÖúÕâЩ°ü×°Àà¾ÍÄܱàд´úÂëÀ´À©Õ¹HttpServletRequest£¬ÖØÔØ·µ»ØHttpSessionµÄ·½·¨£¬ÈÃËü·µ»ØÓÉÍⲿ´æ´¢ËùÌṩµÄʵÏÖ¡£ÈçϵĴúÂëÊÇ´ÓSpring 
                          SessionÏîÄ¿ÖÐÌáÈ¡³öÀ´µÄ£¬µ«ÊÇÎÒ½«ÔÀ´µÄ×¢ÊÍÌæ»»ÎªÎÒ×Ô¼ºµÄ×¢ÊÍ£¬ÓÃÀ´ÔÚ±¾ÎÄÖнâÊÍ´úÂ룬ËùÒÔÔÚÔĶÁÏÂÃæµÄ´úÂëÆ¬¶Îʱ£¬ÇëÁôÒâ×¢ÊÍ¡£ 
                           
                            | /** ×¢Ò⣬Spring SessionÏîÄ¿¶¨ÒåÁËÀ©Õ¹×Ô
 * ±ê×¼HttpServletRequestWrapperµÄÀ࣬ÓÃÀ´ÖØÔØ
 * HttpServletRequestÖÐÓësessionÏà¹ØµÄ·½·¨¡£
 */
 private final class SessionRepositoryRequestWrapper
 extends HttpServletRequestWrapper {
  private HttpSessionWrapper currentSession;private Boolean requestedSessionIdValid;
 private boolean requestedSessionInvalidated;
 private final HttpServletResponse response;
 private final ServletContext servletContext;
  /** ×¢Ò⣬Õâ¸ö¹¹ÔìÆ÷·Ç³£¼òµ¥£¬Ëü½ÓÊÜÉÔºó»áÓõ½µÄ²ÎÊý£¬
 * ²¢ÇÒίÍиøËüËùÀ©Õ¹µÄHttpServletRequestWrapper
 */
 private SessionRepositoryRequestWrapper(
 HttpServletRequest request,
 HttpServletResponse response,
 ServletContext servletContext) {
 super(request);
 this.response = response;
 this.servletContext = servletContext;
 }
  /** ÔÚÕâÀSpring SessionÏîÄ¿²»ÔÙ½«µ÷ÓÃίÍиø
 * Ó¦Ó÷þÎñÆ÷£¬¶øÊÇʵÏÖ×Ô¼ºµÄÂß¼£¬
 * ·µ»ØÓÉÍⲿÊý¾Ý´æ´¢×÷Ϊ֧³ÅµÄHttpSessionʵÀý¡£
 *
 * »ù±¾µÄʵÏÖÊÇ£¬Ïȼì²éÊDz»ÊÇÒѾÓÐsessionÁË¡£Èç¹ûÓеϰ£¬
 * ¾Í½«Æä·µ»Ø£¬·ñÔòµÄ»°£¬Ëü»á¼ì²éµ±Ç°µÄÇëÇóÖÐÊÇ·ñÓÐsession id¡£
 * Èç¹ûÓеϰ£¬½«»á¸ù¾ÝÕâ¸ösession id£¬´ÓËüµÄSessionRepositoryÖмÓÔØsession¡£
 * Èç¹ûsession repositoryÖÐûÓÐsession£¬»òÕßÔÚµ±Ç°ÇëÇóÖУ¬
 * ûÓе±Ç°session idÓëÇëÇó¹ØÁªµÄ»°£¬
 * ÄÇôËü»á´´½¨Ò»¸öеÄsession£¬²¢½«Æä³Ö¾Ã»¯µ½session repositoryÖС£
 */
 @Override
 public HttpSession getSession(boolean create) 
                                {
 if(currentSession != null) {
 return currentSession;
 }
 String requestedSessionId = getRequestedSessionId();
 if(requestedSessionId != null) {
 S session = sessionRepository.getSession(requestedSessionId);
 if(session != null) {
 this.requestedSessionIdValid = true;
 currentSession = new HttpSessionWrapper(session, 
                                getServletContext());
 currentSession.setNew(false);
 return currentSession;
 }
 }
 if(!create) {
 return null;
 }
 S session = sessionRepository.createSession();
 currentSession = new HttpSessionWrapper(session, 
                                getServletContext());
 return currentSession;
 }
  @Overridepublic HttpSession getSession() {
 return getSession(true);
 }
 }
 |  Spring Session¶¨ÒåÁËSessionRepositoryFilter£¬ËüʵÏÖÁË Servlet 
                          Filter½Ó¿Ú¡£ÎÒ³éÈ¡ÁËÕâ¸öfilterµÄ¹Ø¼ü²¿·Ö£¬½«ÆäÁÐÔÚÏÂÃæµÄ´úÂëÆ¬¶ÎÖУ¬ÎÒ»¹Ìí¼ÓÁËһЩעÊÍ£¬ÓÃÀ´ÔÚ±¾ÎÄÖвûÊöÕâЩ´úÂ룬ËùÒÔ£¬Í¬ÑùµÄ£¬ÇëÔĶÁÏÂÃæ´úÂëµÄ×¢ÊͲ¿·Ö¡£ 
                           
                            | /** SessionRepositoryFilterÖ»ÊÇÒ»¸ö±ê×¼µÄServletFilter£¬
 * ËüµÄʵÏÖÀ©Õ¹ÁËÒ»¸öhelper»ùÀà¡£
 */
 public class SessionRepositoryFilter < S extends ExpiringSession >
 extends OncePerRequestFilter {
  /** Õâ¸ö·½·¨ÊÇħÁ¦ÕæÕý·¢»Ó×÷Óõĵط½¡£Õâ¸ö·½·¨´´½¨ÁË
 * ÎÒÃÇÉÏÎÄËùÊöµÄ·â×°ÇëÇó¶ÔÏóºÍ
 * Ò»¸ö·â×°µÄÏìÓ¦¶ÔÏó£¬È»ºóµ÷ÓÃÆäÓàµÄfilterÁ´¡£
 * ÕâÀ¹Ø¼üÔÚÓÚµ±Õâ¸öfilterºóÃæµÄÓ¦ÓôúÂëÖ´ÐÐʱ£¬
 * Èç¹ûÒª»ñµÃsessionµÄ»°£¬µÃµ½µÄ½«»áÊÇSpring SessionµÄ
 * HttpServletSessionʵÀý£¬ËüÊÇÓɺó¶ËµÄÍⲿÊý¾Ý´æ´¢×÷Ϊ֧³ÅµÄ¡£
 */
 protected void doFilterInternal(
 HttpServletRequest request,
 HttpServletResponse response,
 FilterChain filterChain) throws ServletException, 
                                IOException {
  request.setAttribute(SESSION_REPOSITORY_ATTR, 
                                sessionRepository);  SessionRepositoryRequestWrapper wrappedRequest 
                                =new SessionRepositoryRequestWrapper(request,response,servletContext);
  SessionRepositoryResponseWrapper wrappedResponse 
                                =new SessionRepositoryResponseWrapper(wrappedRequest, 
                                response);
  HttpServletRequest strategyRequest =httpSessionStrategy.wrapRequest(wrappedRequest, 
                                wrappedResponse);
  HttpServletResponse strategyResponse =httpSessionStrategy.wrapResponse(wrappedRequest, 
                                wrappedResponse);
  try {filterChain.doFilter(strategyRequest, strategyResponse);
 } finally {
 wrappedRequest.commitSession();
 }
 }
 }
 
 |  ÎÒÃÇ´ÓÕâÒ»Õ½ڵõ½µÄ¹Ø¼üÐÅÏ¢ÊÇ£¬Spring Session¶ÔHTTPµÄÖ§³ÖËùÒÀ¿¿µÄÊÇÒ»¸ö¼òµ¥ÀÏʽµÄServletFilter£¬½èÖúservlet¹æ·¶Öбê×¼µÄÌØÐÔÀ´ÊµÏÖSpring 
                          SessionµÄ¹¦ÄÜ¡£Òò´Ë£¬ÎÒÃÇÄܹ»ÈÃÒÑÓеÄwarÎļþʹÓÃSpring SessionµÄ¹¦ÄÜ£¬¶øÎÞÐèÐÞ¸ÄÒÑÓеĴúÂ룬µ±È»Èç¹ûÄãʹÓÃjavax.servlet.http.HttpSessionListenerµÄ»°£¬¾ÍÁíµ±±ðÂÛÁË¡£Spring 
                          Session 1.0²¢²»Ö§³ÖHttpSessionListener £¬µ«ÊÇSpring Session 
                          1.1 M1·¢²¼°æ±¾ÒѾÌí¼ÓÁ˶ÔËüµÄÖ§³Ö£¬Äã¿ÉÒÔͨ¹ý¸ÃµØÖ·Á˽â¸ü¶àϸ½ÚÐÅÏ¢¡£ ÅäÖÃSpring Session ÔÚWebÏîÄ¿ÖÐÅäÖÃSpring Session·ÖΪËIJ½£º ´î½¨ÓÃÓÚSpring SessionµÄÊý¾Ý´æ´¢  ½«Spring SessionµÄjarÎļþÌí¼Óµ½webÓ¦ÓÃÖÐ  ½«Spring Session filterÌí¼Óµ½webÓ¦ÓõÄÅäÖÃÖÐ  ÅäÖÃSpring SessionÈçºÎÑ¡ÔñsessionÊý¾Ý´æ´¢µÄÁ¬½Ó  Spring Session×Ô´øÁ˶ÔRedisµÄÖ§³Ö¡£´î½¨ºÍ°²×°redisµÄϸ½Ú¿ÉÒԲο¼¸ÃµØÖ·¡£ ÓÐÁ½ÖÖ³£¼ûµÄ·½Ê½Äܹ»Íê³ÉÉÏÊöµÄSpring SessionÅäÖò½Öè¡£µÚÒ»ÖÖ·½Ê½ÊÇʹÓÃSpring 
                          BootÀ´×Ô¶¯ÅäÖÃSpring Session¡£µÚ¶þÖÖÅäÖÃSpring SessionµÄ·½Ê½ÊÇÊÖ¶¯Íê³ÉÉÏÊöµÄÿһ¸öÅäÖò½Öè¡£ ½èÖúÏñMaven»òGradleÕâÑùµÄÒÀÀµ¹ÜÀíÆ÷£¬½«Spring SessionÌí¼ÓÓ¦ÓÃÖÐÊǺÜÈÝÒ׵ġ£Èç¹ûÄãʹÓÃMavenºÍSpring 
                          BootµÄ»°£¬ÄÇô¿ÉÒÔÔÚpom.xmlÖÐʹÓÃÈçϵÄÒÀÀµ£º 
                           
                            | <dependency><groupId>org.springframework.session</groupId>
 <artifactId>spring-session</artifactId>
 <version>1.0.2.RELEASE</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-redis</artifactId>
 </dependency>
 
 |  ÆäÖУ¬spring-boot-starter-redisÒÀÀµÄܹ»È·±£Ê¹ÓÃredisËùÐèµÄËùÓÐjar¶¼»á°üº¬ÔÚÓ¦ÓÃÖУ¬ËùÒÔËüÃÇ¿ÉÒÔ½èÖúSpring 
                          Boot½øÐÐ×Ô¶¯×°Åä¡£spring-sessionÒÀÀµ½«»áÒýÈë Spring SessionµÄjar¡£ ÖÁÓÚSpring Session Servlet filterµÄÅäÖ㬿ÉÒÔͨ¹ýSpring 
                          BootµÄ×Ô¶¯ÅäÖÃÀ´ÊµÏÖ£¬ÕâÖ»ÐèÒªÔÚSpring BootµÄÅäÖÃÀàÉÏʹÓà @EnableRedisHttpSession×¢½â¾Í¿ÉÒÔÁË£¬ÈçÏÂÃæµÄ´úÂëÆ¬¶ÎËùʾ¡£ 
                           
                            | @SpringBootApplication@EnableRedisHttpSession
 public class ExampleApplication {
  public static void main(String[] args) {SpringApplication.run(ExampleApplication.class, 
                                args);
 }
 }
 
 |  ÖÁÓÚSpring Sessionµ½RedisÁ¬½ÓµÄÅäÖ㬿ÉÒÔÌí¼ÓÈçÏÂÅäÖõ½Spring BootµÄapplication.propertiesÎļþÖУº 
                           
                            | spring.redis.host=localhostspring.redis.password=secret
 spring.redis.port=6379
 
 |  Spring BootÌṩÁË´óÁ¿µÄ»ù´¡ÉèÊ©ÓÃÀ´ÅäÖõ½RedisµÄÁ¬½Ó£¬¶¨Òåµ½RedisÊý¾Ý¿âÁ¬½ÓµÄ¸÷ÖÖ·½Ê½¶¼¿ÉÒÔÓÃÔÚÕâÀï¡£Äã¿ÉÒԲο¼¸ÃµØÖ·µÄÖð²½²Ù×÷Ö¸ÄÏ£¬À´Á˽âÈçºÎʹÓÃSpring 
                          SessionºÍSpring Boot¡£ ÔÚ´«Í³µÄwebÓ¦ÓÃÖУ¬¿ÉÒԲο¼¸ÃÖ¸ÄÏÀ´Á˽âÈçºÎͨ¹ýweb.xmlÀ´Ê¹ÓÃSpring 
                          Session¡£ ÔÚ´«Í³µÄwarÎļþÖУ¬¿ÉÒԲο¼¸ÃÖ¸ÄÏÀ´Á˽âÈçºÎ²»Ê¹ÓÃweb.xml½øÐÐÅäÖᣠĬÈÏÇé¿öÏ£¬Spring Session»áʹÓÃHTTP cookieÀ´´æ´¢session 
                          id£¬µ«ÊÇÎÒÃÇÒ²¿ÉÒÔÅäÖÃSpring SessionʹÓÃ×Ô¶¨ÒåµÄHTTP headerÐÅÏ¢£¬Èçx-auth-token: 
                          0dc1f6e1-c7f1-41ac-8ce2-32b6b3e57aa3£¬µ±¹¹½¨REST APIµÄʱºò£¬ÕâÖÖ·½Ê½ÊǺÜÓÐÓõġ£ÍêÕûµÄÖ¸ÄÏ¿ÉÒԲο¼¸ÃµØÖ·¡£ ʹÓÃSpring Session Spring SessionÅäÖÃÍê³ÉÖ®ºó£¬ÎÒÃǾͿÉÒÔʹÓñê×¼µÄServlet 
                          APIÓëÖ®½»»¥ÁË¡£ÀýÈ磬ÈçϵĴúÂ붨ÒåÁËÒ»¸öservlet£¬ËüʹÓñê×¼µÄServlet session 
                          APIÀ´·ÃÎÊsession¡£ 
                           
                            | @WebServlet("/example")public class Example extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 // ʹÓÃÕý³£µÄservlet API»ñÈ¡session£¬Ôڵײ㣬// sessionÊÇͨ¹ýSpring SessionµÃµ½µÄ£¬²¢ÇÒ»á´æ´¢µ½Redis»ò
 // ÆäËûÄãËùÑ¡ÔñµÄÊý¾ÝÔ´ÖÐ
  HttpSession session = request.getSession();String value = session.getAttribute(a€?someAttributea€?);
  }}
 |  ÿ¸öä¯ÀÀÆ÷¶à¸öSession Spring Session»áΪÿ¸öÓû§±£Áô¶à¸ösession£¬ÕâÊÇͨ¹ýʹÓÃÃûΪ¡°_s¡±µÄsession±ðÃû²ÎÊýʵÏֵġ£ÀýÈ磬Èç¹ûµ½´ïµÄÇëÇóΪhttp://example.com/doSomething?_s=0 
                          £¬ÄÇôSpring Session½«»á¶ÁÈ¡¡°_s¡±²ÎÊýµÄÖµ£¬²¢Í¨¹ýËüÈ·¶¨Õâ¸öÇëÇóËùʹÓõÄÊÇĬÈÏsession¡£ Èç¹ûµ½´ïµÄÇëÇóÊÇhttp://example.com/doSomething?_s=1µÄ»°£¬ÄÇôSpring 
                          Session¾ÍÄÜÖªµÀÕâ¸öÇëÇóËùҪʹÓõÄsession±ðÃûΪ1.Èç¹ûÇëÇóûÓÐÖ¸¶¨¡°_s¡±²ÎÊýµÄ»°£¬ÀýÈçhttp://example.com/doSomething£¬ÄÇôSpring 
                          Session½«ÆäÊÓΪʹÓÃĬÈϵÄsession£¬Ò²¾ÍÊÇ˵_s=0¡£ ҪΪij¸öä¯ÀÀÆ÷´´½¨ÐµÄsession£¬Ö»ÐèÒªµ÷ÓÃjavax.servlet.http.HttpServletRequest.getSession()¾Í¿ÉÒÔÁË£¬¾ÍÏñÎÒÃÇͨ³£Ëù×öµÄÄÇÑù£¬Spring 
                          Session½«»á·µ»ØÕýÈ·µÄsession»òÕß°´ÕÕ±ê×¼Servlet¹æ·¶µÄÓïÒå´´½¨Ò»¸öеÄsession¡£ÏÂÃæµÄ±í¸ñÃèÊöÁËÕë¶Ôͬһ¸öä¯ÀÀÆ÷´°¿Ú£¬getSession()Ãæ¶Ô²»Í¬urlʱµÄÐÐΪ¡£ 
 ÈçÉÏÃæµÄ±í¸ñËùʾ£¬session±ðÃû²»Ò»¶¨±ØÐëÊÇÕûÐÍ£¬ËüÖ»Ðè񻂿±ðÓÚÆäËû·ÖÅ䏸Óû§µÄsession±ðÃû¾Í¿ÉÒÔÁË¡£µ«ÊÇ£¬ÕûÐ͵Äsession±ðÃû¿ÉÄÜÊÇ×îÒ×ÓÚʹÓõģ¬Spring 
                          SessionÌṩÁËHttpSessionManager½Ó¿Ú£¬Õâ¸ö½Ó¿Ú°üº¬ÁËһЩʹÓÃsession±ðÃûµÄ¹¤¾ß·½·¨¡£ ÎÒÃÇ¿ÉÒÔÔÚHttpServletRequestÖУ¬Í¨¹ýÃûΪ¡°org.springframework.session.web.http.HttpSessionManager¡±µÄÊôÐÔ»ñÈ¡µ±Ç°µÄHttpSessionManager¡£ÈçϵÄÑùÀý´úÂë²ûÊöÁËÈçºÎµÃµ½HttpSessionManager£¬²¢ÇÒÔÚÑùÀý×¢ÊÍÖÐÃèÊöÁËÆä¹Ø¼ü·½·¨µÄÐÐΪ¡£ 
                           
                            | @WebServlet("/example")public class Example extends HttpServlet {
 @Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse 
                                response)
 throws ServletException, IOException {
  /** ÔÚÇëÇóÖУ¬¸ù¾ÝÃûΪorg.springframework.session.web.http.HttpSessionManagerµÄkey
 * »ñµÃSpring Session session¹ÜÀíÆ÷µÄÒýÓÃ
 */
  HttpSessionManager sessionManager=(HttpSessionManager)request.getAttribute("org.springframework.session.web.http.HttpSessionManager");
  /** ʹÓÃsession¹ÜÀíÆ÷ÕÒ³öËùÇëÇósessionµÄ±ðÃû¡£
 * ĬÈÏÇé¿öÏ£¬session±ðÃû»á°üº¬ÔÚurlÖУ¬²¢ÇÒÇëÇó²ÎÊýµÄÃû³ÆÎª¡°_s¡±¡£
 * ÀýÈ磬http://localhost:8080/example?_s=1
 * ½«»áʹÈçϵĴúÂë´òÓ¡³ö¡°Requested Session Alias is: 1¡±
 */
 String requestedSessionAlias=sessionManager.getCurrentSessionAlias(request);
 System.out.println("Requested Session Alias 
                                is: " + requestedSessionAlias);
  /* ·µ»ØÒ»¸öΨһµÄsession±ðÃûid£¬Õâ¸ö±ðÃûĿǰûÓб»ä¯ÀÀÆ÷ÓÃÀ´·¢ËÍÇëÇó¡£* Õâ¸ö·½·¨²¢²»»á´´½¨ÐµÄsession£¬
 * ÎÒÃÇÐèÒªµ÷ÓÃrequest.getSession()À´´´½¨ÐÂsession¡£
 */
 String newSessionAlias = sessionManager.getNewSessionAlias(request);
  /* ʹÓÃд´½¨µÄsession±ðÃûÀ´½¨Á¢URL£¬Õâ¸öURL½«»á°üº¬* ¡°_s¡±²ÎÊý¡£ÀýÈ磬Èç¹ûnewSessionAliasµÄֵΪ2µÄ»°£¬
 * ÄÇôÈçÏµķ½·¨½«»á·µ»Ø¡°/inbox?_s=2¡±
 */
  String encodedURL = sessionManager.encodeURL("/inbox", 
                                newSessionAlias);System.out.println(encodedURL);
  /* ·µ»Øsession±ðÃûÓësession idËù×é³ÉµÄMap£¬* ËüÃÇÊÇÓÉä¯ÀÀÆ÷·¢ËÍÇëÇóËùÐγɵġ£
 */
 Map < String, String > sessionIds = sessionManager.getSessionIds(request);
 }
 }
 |  ½áÂÛ Spring SessionΪÆóÒµ¼¶JavaµÄsession¹ÜÀí´øÀ´Á˸ïУ¬Ê¹µÃÈçϵÄÈÎÎñ±äµÃ¸ü¼ÓÈÝÒ×£º ±àд¿ÉˮƽÀ©Õ¹µÄÔÉúÔÆÓ¦Óᣠ ½«sessionËù±£´æµÄ×´Ì¬Ð¶ÔØµ½Ìض¨µÄÍⲿsession´æ´¢ÖУ¬ÈçRedis»òApache 
                          GeodeÖУ¬ËüÃÇÄܹ»ÒÔ¶ÀÁ¢ÓÚÓ¦Ó÷þÎñÆ÷µÄ·½Ê½Ìṩ¸ßÖÊÁ¿µÄ¼¯Èº¡£  µ±Óû§Ê¹ÓÃWebSocket·¢ËÍÇëÇóµÄʱºò£¬Äܹ»±£³ÖHttpSession´¦ÓÚ»îԾ״̬¡£ 
                         ÔÚ·ÇWebÇëÇóµÄ´¦Àí´úÂëÖУ¬Äܹ»·ÃÎÊsessionÊý¾Ý£¬±ÈÈçÔÚJMSÏûÏ¢µÄ´¦Àí´úÂëÖС£ 
                         Ö§³Öÿ¸öä¯ÀÀÆ÷ÉÏʹÓöà¸ösession£¬ÕâÑù¾Í¿ÉÒÔºÜÈÝÒ׵ع¹½¨¸ü¼Ó·á¸»µÄÖÕ¶ËÓû§ÌåÑé¡£ 
                         ¿ØÖƿͻ§¶ËºÍ·þÎñÆ÷¶ËÖ®¼äÈçºÎ½øÐÐsession idµÄ½»»»£¬ÕâÑù¸ü¼ÓÒ×ÓÚ±àдRestful 
                          API£¬ÒòΪËü¿ÉÒÔ´ÓHTTP Í·ÐÅÏ¢ÖлñÈ¡session id£¬¶ø²»±ØÔÙÒÀÀµÓÚcookie¡£  Èç¹ûÄãÏëÅׯú´«Í³µÄÖØÁ¿¼¶Ó¦Ó÷þÎñÆ÷£¬µ«ÊÜÖÆÓÚÒѾʹÓÃÁËÕâЩӦÓ÷þÎñÆ÷µÄsession¼¯ÈºÌØÐÔ£¬ÄÇôSpring 
                          Session½«ÊǰïÖúÄãÂõÏò¸ü¼ÓÇáÁ¿¼¶ÈÝÆ÷µÄÖØÒªÒ»²½£¬ÕâЩÇáÁ¿¼¶µÄÈÝÆ÷°üÀ¨Tomcat¡¢Jetty»òUndertow¡£ |