In den letzten Tagen habe ich an so einem gearbeitet Nachdem ich viele Informationen überprüft habe, habe ich das Gefühl, dass es zu verwirrend ist und ich nie das finden konnte, was ich wollte. Hier werde ich zusammenfassen, wie ich Verwenden Sie Redis, um Sitzungen zu implementieren, um zukünftige Anfragen zu erleichtern, und ich hoffe, dass es Freunden, die diesbezüglich Bedürfnisse haben, helfen kann.
Empfehlungen zu verwandten Themen: PHP-Sitzung (einschließlich Bilder, Videos, Fälle)
Lass uns zuerst reden Werfen wir einen Blick auf meine Entwicklungsumgebung: Nginx, Redis, Tomcat, verwenden Sie Moven zum Erstellen des Projekts und führen Sie den Jetty-Server aus. Im Folgenden wird also auch erläutert, wie Sie mit Maven ein Kriegspaket erstellen und zur Ausführung bereitstellen auf Tomcat.
Das Speichern und Abrufen von Werten hängt vollständig vom Schlüssel ab. Weil es originell und professionell ist Fügen Sie es ein. Ich möchte mehr wissen. Sie können nach der offiziellen Einführung
suchen
<!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency>
Konfigurieren Sie
<!-- redis 客户端配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${jedisPoolConfig.maxTotal}"/>
<property name="maxIdle" value="${jedisPoolConfig.maxIdle}"/>
<property name="maxWaitMillis" value="${jedisPoolConfig.maxWaitMillis}"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
</bean>
<bean id="readJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${jedis.read.host}" />
<property name="port" value="${jedis.read.port}" />
<property name="password" value="${jedis.read.password}" />
<property name="timeout" value="${jedis.read.timeout}" />
<property name="database" value="${jedis.read.database}" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="writeJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${jedis.write.host}" />
<property name="port" value="${jedis.write.port}" />
<property name="password" value="${jedis.write.password}" />
<property name="timeout" value="${jedis.write.timeout}" />
<property name="database" value="${jedis.write.database}" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="readRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="readJedisConnectionFactory" />
</bean>
<bean id="writeRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="writeJedisConnectionFactory" />
</bean>
Der erste Schritt
, stellen Sie <🎜 vor >RedisTemplate
@Autowired @Qualifier("writeRedisTemplate") private StringRedisTemplate writeTemplate;
Sie müssen writeRedisTemplate hier nur eingeben, es ist nur für das Schreiben verantwortlich. Tun Sie dies nur, wenn Sie es erneut aktualisieren Sie müssen lesen
Der zweite Schritt
ist der normale Anmeldevorgang. Nach erfolgreicher Anmeldung müssen bei der Anfrage auch die Sitzungsinformationen gespeichert werden
Der dritte Schritt
, Cookie-Wert festlegen, speichern Schlüsselwert in Redis als Benutzer speichernSitzungsinformationen im Cookie, beim Aktualisieren des Browsers, Filter Sie können den -Wert aus dem Cookie abrufen und dann zu Redis gehen, um den entsprechenden Wert abzurufen, nämlich
String domain = request.getServerName(); String cookieId=MD5Util.MD5Encode("uasLoginer", "UTF-8"); //生成token,用作session在redis存储中的key值 StringredisSessionKey= UUID.randomUUID().toString(); Cookie uasLoginer = new Cookie(cookieId, redisSessionKey); if (domain.startsWith("uas.")) { uasLoginer.setDomain(domain.substring(4,domain.length())); }else { uasLoginer.setDomain(domain); } uasLoginer.setMaxAge(60000); uasLoginer.setPath("/"); response.addCookie(uasLoginer);
key
Hier wird das Cookie über die Domain setDomain und setPath hinweg gesetzt userSession
Der vierte Schritt
, speichern die Informationen in Redis Redis in RedisTemplate schreiben Der Wert muss vom Typ String sein und das userSession-Objekt muss in einen Json-String konvertiert werden userSession
userSessionString = JSON.toJSONString(userSession);
在转Json的时候,遇到问题,导入import com.alibaba.fastjson.JSON;一直失败,发现pom中没有依赖Json的关系,如果有遇到相同的问题,可以检查下在pom.xml中是否有关于json的依赖关系,没的话,在pom.xml中导入json的依赖关系,如下:
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.3</version> <classifier>jdk15</classifier> </dependency>
写入redis的代码如下:
writeTemplate.opsForHash().put(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey,redisSessionKey, userSessionString); writeTemplate.expire(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey, 1800L, TimeUnit.SECONDS);//设置redis中值的有效期
完成这一操作,用户的session信息已经存入到redis中,可在redis中查看是否存入。
第五步:进入页面后,刷新页面,请求会经过过滤器,在Filter.Java中读取redis的值并进行一些处理
在过滤器这里,就无法通过注解的方式引入redisTemplate,可以通过如下的方式引入:
BeanFactory beans = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); StringRedisTemplate readTemplate = (StringRedisTemplate) beans.getBean("readRedisTemplate"); StringRedisTemplate writeTemplate = (StringRedisTemplate) beans.getBean("writeRedisTemplate");
过滤器从cookie中取出redis的key值,用readTemplate读出value值
String cookid=MD5Util.MD5Encode("uasLoginer", "UTF-8"); Cookie[] cookies = req.getCookies(); String redisSessionKey = ""; if(cookies != null){ for (Cookie cookie : cookies) { if(cookie.getName().equals(cookid)){ redisSessionKey = cookie.getValue() ; } } } UserSession userSession = null; String userSessionString = (String) readTemplate.boundHashOps(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey).get(redisSessionKey); if(null != userSessionString ){ @SuppressWarnings("static-access") JSONObject obj = new JSONObject().fromObject(userSessionString);//将json字符串转换为json对象 userSession = (UserSession)JSONObject.toBean(obj,UserSession.class); writeTemplate.expire(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey, 1800L, TimeUnit.SECONDS); request.getSession().setAttribute(UasContants.USER_SESSION, userSession); } if (userSession != null) { chain.doFilter(req, res); return; }else { res.sendRedirect(UasContants.LOGIN_URL); return; }
在这里,另外附上关于web.xml关于LoginFilter的配置,有需要的可以参考下:
<!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.sfbest.uas.filter.LoginFilter</filter-class> <init-param> <param-name>excludePaths</param-name> <param-value>/login,/user/login,/user/auth</param-value> </init-param> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
按照上面的配置,就可以用redis实现session共享的功能,但我在开发的时候,遇到一个蛋疼的问题,在测试环境上,
把项目部署在两台tomcat
服务器上的时候,cookie里一直存不进去redis的key值,单台可以存进去,经过长期的检测,
终于发现是nginx配置出的问题,引以为戒,深深的阴影。下面我贴出我正常运行时nginx的配置代码
upstream uassessiontest.d.com { server 10.103.16.226:8088; server 10.103.16.226:8089; } server { log_format sf_uastest '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_cookie'; listen 80; server_name uassessiontest.d.com; access_log /var/log/nginx/uassessiontest.log sf_uastest; location / { rewrite ^/$ /uas/ break; proxy_pass http://uassessiontest.d.com; } }
红色的为当初少配的部分,这些部分是的作用是往浏览器端写入cookie值。
相关学习推荐:redis视频教程
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Redis-Implementierung der Sitzungsfreigabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!