标签:技术分享 add head 反向 请求 部分 sso val 文章
javaweb中我们项目稍微正规点,都会用到单点登录这个技术。实现它的方法各家有各界的看法。这几天由于公司项目需求正在研究。下面整理一下最近整理的心得。
下载好上面的jar包,把他放在tomcat的lib文件下。
然后修改Tomcat里的conf/context.xml文件
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.130"
port="7006"
database="db0"
maxInactiveInterval="60" />
上面配置的host和port就是我们redis的host和port,所以在此之前我们需要先开启一个redis服务出来。
点我查看如何配置redis(本文配置集群,配置单节点一样)
点我查看如何配置redis和spring的整合
点我查看如何配置redis中你遇到的问题汇总
database就是讲该tomcat与浏览器会话时产生的session存放在redis中的位置
到这里我们的第一个Tomcat配置完成。下面就是重复上面的步骤多配制几个Tomcat
nginx的下载官网有现成的,直接下载符合自己电脑的版本傻瓜式安装就行了。(安装或者解压不要出现中文)
找到conf/nginx.conf文件在里面修改设置
upstream mynginxserver {
server 192.168.1.78:8080 weight=1;
server 192.168.1.130:8080 weight=1;
}
upstream mynginxserver {
server 192.168.1.78:8080 weight=1;
server 192.168.1.130:8080 weight=1;
}
server {
listen 802;
server_name 192.168.1.130;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://mynginxserver;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache‘s document root
# concurs with nginx‘s one
#
#location ~ /\.ht {
# deny all;
#}
}
192.168.1.130:802
具体看看我画的思维导图吧:
第二章明显出错了,事实上并没有存储在实现约定的redis上
<dependency> <groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.1.1.RELEASE</version>
</dependency>
spring-data-redis.jar
redis.clients.jar
spring-session.jar
有了上面的准备资料后,我们可以在是spring的配置文件中配置spring session了
很简单我们需要引入spring session中的bean
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
spring:session:sessions:c0d1fadd-b04a-4244-9525-0f13ea7173bf
。其中后面一串id就是我们Tomcat和浏览器会话时差生的sessionid。在上面我们配置spring session 已经可以实现了session共享了。但是细心的朋友可以发现。session并没有真正意义上的共享。上面我们可以看到session在redis集群中的key包含了Tomcat和浏览器的sessionid。也就是说redis上这个session只能是我的这个Tomcat在该浏览器上才可以访问到。别的Tomcat就算和同一个浏览器交互也是拿不到redis上这个session的。这种效果是你们想要的吗。答案并不是。上面实现的效果我用一幅图描述一下。
也就是说上面我的配置只是将Tomcat的session转移到了redis上。多服务的session仍然是各区各的。这是一个大坑。坑了好久。然后我想了另外一种办法现在可以解决这个局限性。
1– 重写spring session源码,重写里面讲session存储在redis那部分代码,主要就是为了将redis 中session的key写成固定值。以后我们在去session中取这个固定的key就可以实现session共享了。
2–只重写spring session中我们的session仓库中去的策略,就是在A项目登录后将产生的sessionID传递给B项目。B项目在根据这个sessionid去redis中获取。
上面两中方法需要自定义很多类,整理了自定义的类和配置文件的配置。点我下载
3– 在向session中存值的地方,将sessionid作为value,请求头中的Host和Agent组合最为key存储在redis上。然后我们在spring session去session的方法里在根据Host和Agent组成的key去获取sessionid,然后就可以获取对应的session了。
public static Map<String, Object> getInfoFromUrl(HttpServletRequest request)
{
Map<String, Object> resultMap=new HashMap<String, Object>();
String Agent = request.getHeader("User-Agent");
String Host = request.getHeader("Host");
resultMap.put("agent", Agent);
resultMap.put("host", Host);
return resultMap;
}
public static String getKeyFromUrl(HttpServletRequest request)
{
String result="";
Map<String, Object> map = getInfoFromUrl(request);
Set<String> keySet = map.keySet();
for (String key : keySet)
{
result+=map.get(key).toString();
}
return result;
}
<bean id="redisCacheTemplate" class="com.bshinfo.web.base.cache.RedisCacheTemplate"/>
<bean id="zxh" class="com.bshinfo.web.base.cache.CookieHttpSessionStrategyTest">
<property name="redisCacheTemplate" ref="redisCacheTemplate" />
</bean>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="httpSessionStrategy" ref="zxh"/>
<property name="maxInactiveIntervalInSeconds" value="60"/>
</bean>
标签:技术分享 add head 反向 请求 部分 sso val 文章
原文地址:http://blog.csdn.net/u013132051/article/details/65936456