{"id":201803,"date":"2025-05-10T10:42:46","date_gmt":"2025-05-10T02:42:46","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201803\/"},"modified":"2025-05-10T10:42:46","modified_gmt":"2025-05-10T02:42:46","slug":"springsession%e9%80%9a%e8%bf%87redis%e7%bb%9f%e8%ae%a1%e5%9c%a8%e7%ba%bf%e7%94%a8%e6%88%b7%e6%95%b0%e9%87%8f%e7%9a%84%e5%ae%9e%e7%8e%b0%e4%bb%a3%e7%a0%81","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201803\/","title":{"rendered":"SpringSession\u901a\u8fc7Redis\u7edf\u8ba1\u5728\u7ebf\u7528\u6237\u6570\u91cf\u7684\u5b9e\u73b0\u4ee3\u7801"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>SpringSession\u901a\u8fc7Redis\u7edf\u8ba1\u5728\u7ebf\u7528\u6237\u6570\u91cf\u7684\u5b9e\u73b0\u4ee3\u7801<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u6570\u636e\u5e93\u5c0f\u767d\u4e00\u679a\uff0c\u6b63\u5728\u4e0d\u65ad\u5b66\u4e60\u79ef\u7d2f\u77e5\u8bc6\uff0c\u73b0\u5c06\u5b66\u4e60\u5230\u7684\u77e5\u8bc6\u8bb0\u5f55\u4e00\u4e0b\uff0c\u4e5f\u662f\u5c06\u6211\u7684\u6240\u5f97\u5206\u4eab\u7ed9\u5927\u5bb6\uff01\u800c\u4eca\u5929\u8fd9\u7bc7\u6587\u7ae0\u300aSpringSession\u901a\u8fc7Redis\u7edf\u8ba1\u5728\u7ebf\u7528\u6237\u6570\u91cf\u7684\u5b9e\u73b0\u4ee3\u7801\u300b\u5e26\u5927\u5bb6\u6765\u4e86\u89e3\u4e00\u4e0b##content_title##\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u7684\u77e5\u8bc6\u79ef\u7d2f\u6709\u6240\u5e2e\u52a9\uff0c\u4ece\u800c\u5f25\u8865\u81ea\u5df1\u7684\u4e0d\u8db3\uff0c\u52a9\u529b\u5b9e\u6218\u5f00\u53d1\uff01<\/p>\n<p>\u6700\u8fd1\u9047\u5230\u4e00\u4e2a\u6bd4\u8f83\u7d27\u6025\u7684\u4efb\u52a1\uff0c\u8981\u6c42\u7edf\u8ba1\u5728\u7ebf\u7528\u6237\uff0c\u76ee\u7684\u662f\u914d\u5408\u6027\u80fd\u6d4b\u8bc4\uff0c\u8981\u6c42\u8bc1\u660e\u81ea\u5df1\u7cfb\u7edf\u7684\u5728\u7ebf\u7528\u6237\u80fd\u591f\u8fbe\u6807\uff0c\u4e0d\u8fc7\u7cfb\u7edf\u56e0\u4e3a\u5386\u53f2\u539f\u56e0\uff0c\u5e76\u6ca1\u6709\u8fd9\u4e2a\u529f\u80fd\uff0c\u6240\u4ee5\u53ea\u80fd\u53bbspringSession\u5b98\u7f51\u548c\u7f51\u4e0a\u641c\u8d44\u6599\uff0c\u60f3\u5230\u901a\u8fc7\u7edf\u8ba1redis\u91cc\u7f13\u5b58\u7684\u6570\u636e<\/p>\n<p>\u56e0\u4e3a\u7cfb\u7edf\u539f\u5148\u7684\u903b\u8f91\u662f\u4f7f\u7528Spring Session\u52a0\u4e0aRedis\u505a\u7684\u4f1a\u8bdd\u5171\u4eab\u5b9e\u73b0\u7684\u5355\u70b9\u767b\u5f55\uff0c\u767b\u5f55\u4e4b\u540e\u4f1a\u5728session\u8bbe\u7f6e\u4e00\u4e2akey\u503c\u8868\u793a\u7528\u6237\u5df2\u7ecf\u767b\u5f55\u8fc7\uff0c\u540c\u65f6\u91cd\u5199HttpServletRequestWrapper \u8bbe\u7f6eremoteUser\u6570\u636e\u503c<\/p>\n<pre>class RemoteUserRequestWrapper extends HttpServletRequestWrapper {\n\t\tString userCode;\n\t\tRemoteUserRequestWrapper(HttpServletRequest request) {\n\t\t\tsuper(request);\n\t\t\tthis.userCode = (String) request.getSession()\n\t\t\t\t\t.getAttribute(org.apache.commons.lang3.StringUtils.isBlank(sessionKeyName)?DEFAULT_SESSION_KEY_NAME:sessionKeyName);\n\t\t}\n\t\t@Override\n\t\tpublic String getRemoteUser() {\n\t\t\treturn userCode;\n\t\t}\n\t}<\/pre>\n<p>Spring Session\u7f13\u5b58\u5728redis\u91cc\u7684\u6570\u636e<\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" style=\"max-width:100%\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683881830645dff668f9eb.jpg1683881830645dff668fa00.jpg\" class=\"aligncenter\"><\/p>\n<p>\u8fd9\u4e2a<code>ssoLoginUser<\/code> key\u662f\u81ea\u5df1\u767b\u5f55\u65f6\u5019\u8bbe\u7f6e\u7684\uff0c\u6839\u636e\u4e1a\u52a1\u4fee\u6539\uff0c\u7ecf\u8fc7\u6d4b\u8bd5\uff0c\u5728\u767b\u51fa\u7cfb\u7edf\u65f6\u5019\uff0csession\u8bbe\u7f6e\u8fc7\u671f\u83b7\u53d6removeAttribute\u4e0d\u80fd\u6e05redis\u91cc\u7684key\u6570\u636e\uff0c\u6240\u4ee5\u53ea\u80fd\u5728\u767b\u51fa\u7cfb\u7edf\u903b\u8f91\u52a0\u4e0a\uff1a<\/p>\n<pre>Set\n   \n     keys = RedisUtils.redisTemplate.keys(\"spring:session:sessions:*\");\nfor(String key : keys){\n\tif(key.indexOf(\"expires\")==-1){\n\t\tString s = (String)RedisUtils.redisTemplate.opsForHash().get(key, \"sessionAttr:ssoLoginUser\");\n\t\tif(request.getRemoteUser().equals(s)) {\n\t\t\tlogger.info(\"loginusername:{}\",s)\n\t\t\tRedisUtils.redisTemplate.opsForHash().delete(key, \"sessionAttr:ssoLoginUser\");\n\t\t}\n\t}\n}\n   <\/pre>\n<p>\u8fdb\u884c\u6570\u636e\u7edf\u8ba1\uff1a<\/p>\n<pre>  List&gt; list = new ArrayList&gt;(); List&gt; data = new ArrayList&gt;(); Set\n       \n         keys = redisTemplate.keys(\"spring:session:sessions:*\"); for(String key : keys){ if(key.indexOf(\"expires\")==-1){ String s = (String)redisTemplate.opsForHash().get(key, \"sessionAttr:ssoLoginUser\"); if(StringUtils.isNotBlank(s)) { System.out.println(s); Map\n        \n          map = new HashMap\n         \n          (16); map.put(\"usercode\", s); list.add(map); } } } return list;\n         \n        \n       <\/pre>\n<p>pom.xml\uff1a<\/p>\n<pre>\n   \n    \n     org.springframework.session\n    \n    \n     spring-session-data-redis\n    \n    \n     1.2.2.RELEASE\n    \n    \n     pom\n    \n   \n   \n    \n     biz.paluch.redis\n    \n    \n     lettuce\n    \n    \n     3.5.0.Final\n    \n   <\/pre>\n<p>RedisUtils.java\uff1a<\/p>\n<pre>package com.common.utils.redis;\n\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.web.context.ContextLoader;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\npublic class RedisUtils {\n\n\tprivate RedisUtils() {\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static RedisTemplate\n   \n     redisTemplate =\n\t\t\tContextLoader.getCurrentWebApplicationContext().getBean(RedisTemplate.class);\n\n\t\/**\n\t * \u8bbe\u7f6e\u6709\u6548\u65f6\u95f4\n\t *\n\t * @param key Redis\u952e\n\t * @param timeout \u8d85\u65f6\u65f6\u95f4\n\t * @return true=\u8bbe\u7f6e\u6210\u529f\uff1bfalse=\u8bbe\u7f6e\u5931\u8d25\n\t *\/\n\tpublic static boolean expire(final String key, final long timeout) {\n\n\t\treturn expire(key, timeout, TimeUnit.SECONDS);\n\t}\n\n\t\/**\n\t * \u8bbe\u7f6e\u6709\u6548\u65f6\u95f4\n\t *\n\t * @param key Redis\u952e\n\t * @param timeout \u8d85\u65f6\u65f6\u95f4\n\t * @param unit \u65f6\u95f4\u5355\u4f4d\n\t * @return true=\u8bbe\u7f6e\u6210\u529f\uff1bfalse=\u8bbe\u7f6e\u5931\u8d25\n\t *\/\n\tpublic static boolean expire(final String key, final long timeout, final TimeUnit unit) {\n\n\t\tBoolean ret = redisTemplate.expire(key, timeout, unit);\n\t\treturn ret != null &amp;&amp; ret;\n\t}\n\n\t\/**\n\t * \u5220\u9664\u5355\u4e2akey\n\t *\n\t * @param key \u952e\n\t * @return true=\u5220\u9664\u6210\u529f\uff1bfalse=\u5220\u9664\u5931\u8d25\n\t *\/\n\tpublic static boolean del(final String key) {\n\n\t\tredisTemplate.delete(key);\n\t\treturn true;\n\t}\n\n\t\/**\n\t * \u5220\u9664\u591a\u4e2akey\n\t *\n\t * @param keys \u952e\u96c6\u5408\n\t * @return \u6210\u529f\u5220\u9664\u7684\u4e2a\u6570\n\t *\/\n\tpublic static long del(final Collection\n    \n      keys) { redisTemplate.delete(keys); return 0; } \/** * \u5b58\u5165\u666e\u901a\u5bf9\u8c61 * * @param key Redis\u952e * @param value \u503c *\/ public static void set(final String key, final Object value) { redisTemplate.opsForValue().set(key, value, 1, TimeUnit.MINUTES); } \/\/ \u5b58\u50a8\u666e\u901a\u5bf9\u8c61\u64cd\u4f5c \/** * \u5b58\u5165\u666e\u901a\u5bf9\u8c61 * * @param key \u952e * @param value \u503c * @param timeout \u6709\u6548\u671f\uff0c\u5355\u4f4d\u79d2 *\/ public static void set(final String key, final Object value, final long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); } \/** * \u83b7\u53d6\u666e\u901a\u5bf9\u8c61 * * @param key \u952e * @return \u5bf9\u8c61 *\/ public static Object get(final String key) { return redisTemplate.opsForValue().get(key); } \/\/ \u5b58\u50a8Hash\u64cd\u4f5c \/** * \u5f80Hash\u4e2d\u5b58\u5165\u6570\u636e * * @param key Redis\u952e * @param hKey Hash\u952e * @param value \u503c *\/ public static void hPut(final String key, final String hKey, final Object value) { redisTemplate.opsForHash().put(key, hKey, value); } \/** * \u5f80Hash\u4e2d\u5b58\u5165\u591a\u4e2a\u6570\u636e * * @param key Redis\u952e * @param values Hash\u952e\u503c\u5bf9 *\/ public static void hPutAll(final String key, final Map\n     \n       values) { redisTemplate.opsForHash().putAll(key, values); } \/** * \u83b7\u53d6Hash\u4e2d\u7684\u6570\u636e * * @param key Redis\u952e * @param hKey Hash\u952e * @return Hash\u4e2d\u7684\u5bf9\u8c61 *\/ public static Object hGet(final String key, final String hKey) { return redisTemplate.opsForHash().get(key, hKey); } \/** * \u83b7\u53d6\u591a\u4e2aHash\u4e2d\u7684\u6570\u636e * * @param key Redis\u952e * @param hKeys Hash\u952e\u96c6\u5408 * @return Hash\u5bf9\u8c61\u96c6\u5408 *\/ public static List\n       hMultiGet(final String key, final Collection hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } \/\/ \u5b58\u50a8Set\u76f8\u5173\u64cd\u4f5c \/** * \u5f80Set\u4e2d\u5b58\u5165\u6570\u636e * * @param key Redis\u952e * @param values \u503c * @return \u5b58\u5165\u7684\u4e2a\u6570 *\/ public static long sSet(final String key, final Object... values) { Long count = redisTemplate.opsForSet().add(key, values); return count == null ? 0 : count; } \/** * \u5220\u9664Set\u4e2d\u7684\u6570\u636e * * @param key Redis\u952e * @param values \u503c * @return \u79fb\u9664\u7684\u4e2a\u6570 *\/ public static long sDel(final String key, final Object... values) { Long count = redisTemplate.opsForSet().remove(key, values); return count == null ? 0 : count; } \/\/ \u5b58\u50a8List\u76f8\u5173\u64cd\u4f5c \/** * \u5f80List\u4e2d\u5b58\u5165\u6570\u636e * * @param key Redis\u952e * @param value \u6570\u636e * @return \u5b58\u5165\u7684\u4e2a\u6570 *\/ public static long lPush(final String key, final Object value) { Long count = redisTemplate.opsForList().rightPush(key, value); return count == null ? 0 : count; } \/** * \u5f80List\u4e2d\u5b58\u5165\u591a\u4e2a\u6570\u636e * * @param key Redis\u952e * @param values \u591a\u4e2a\u6570\u636e * @return \u5b58\u5165\u7684\u4e2a\u6570 *\/ public static long lPushAll(final String key, final Collection values) { Long count = redisTemplate.opsForList().rightPushAll(key, values); return count == null ? 0 : count; } \/** * \u5f80List\u4e2d\u5b58\u5165\u591a\u4e2a\u6570\u636e * * @param key Redis\u952e * @param values \u591a\u4e2a\u6570\u636e * @return \u5b58\u5165\u7684\u4e2a\u6570 *\/ public static long lPushAll(final String key, final Object... values) { Long count = redisTemplate.opsForList().rightPushAll(key, values); return count == null ? 0 : count; } \/** * \u4eceList\u4e2d\u83b7\u53d6begin\u5230end\u4e4b\u95f4\u7684\u5143\u7d20 * * @param key Redis\u952e * @param start \u5f00\u59cb\u4f4d\u7f6e * @param end \u7ed3\u675f\u4f4d\u7f6e\uff08start=0\uff0cend=-1\u8868\u793a\u83b7\u53d6\u5168\u90e8\u5143\u7d20\uff09 * @return List\u5bf9\u8c61 *\/ public static List lGet(final String key, final int start, final int end) { return redisTemplate.opsForList().range(key, start, end); } } \n     \n    \n   <\/pre>\n<p>ok\uff0c\u672c\u535a\u5ba2\u53ea\u80fd\u5b66\u4e60\u53c2\u8003\uff0c\u56e0\u4e3a\u53ea\u662f\u8981\u7ed9\u5ba2\u6237\u4e00\u4e9b\u5728\u7ebf\u7528\u6237\u7684\u8bc1\u660e\u800c\u5df2\uff0c\u8fd9\u4e2a\u4e34\u65f6\u7684\u7edf\u8ba1\u4e0d\u80fd\u7528\u4e8e\u751f\u4ea7\uff0c\u8981\u505a\u6bd4\u8f83\u9f50\u5168\u7684\u5728\u7ebf\u7528\u6237\u7edf\u8ba1\uff0c\u9700\u8981\u82b1\u591a\u70b9\u65f6\u95f4\uff0c\u6709\u95ee\u9898\u5e0c\u671b\u80fd\u6307\u51fa\u3002ok\uff0c\u7b80\u5355\u8bb0\u5f55\u4e00\u4e0b\uff0c\u65b9\u4fbf\u4e4b\u540e\u81ea\u5df1\u56de\u987e<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SpringSession\u901a\u8fc7R&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201803","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201803"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201803\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}