之前说了单点登录系统的原理,这篇就来点硬货,说下单点登录的一个系统是如何搭建的。
架构分析
表现层:提供手机客户端,或其他系统的调用
表现层的存在意义就是,提供给所有非本系统的其他系统进行登录。具体实现的思路就是,编写一个登录的接口(本系统使用RESTful风格的),让需要该服务的其他系统通过接口提交数据,并获得相应的返回。
服务层:系统内部的调用
这个比较简单了,内部的所有登录,查询的操作都是通过服务层去实现的。
我们本次的搭建使用maven实现的,如果使用其他技术,请自行从网上查找其他资料
服务层
首先是我们的服务层,我们的服务层中总共只有三个子项目:分别是聚合工程的父工程(taotao-sso)还有就是两个子工程,负责提供接口和依赖的接口工程(taotao-sso-interface)和负责真正的业务处理的业务处理工程(taotao-sso-service)。跟其他聚合工程的的服务层相比,它的里面是没有实体层(pojo)和持久层(mapper)的。因为项目中一般所有的数据库表都是有一个专门的团队去维护的(数据库开发工程师),目的是保证数据的安全性、读取速度等。所以对应的实体层(pojo)和持久层(mapper)的编写一般也都是由他们来进行完成的。
而我们的单点登录系统肯定是要使用实体和持久层的,这个时候,我们需要依赖后台的pojo和mapper就可以了。
表现层
表现层主要提供接口给别的系统用,就是一个普通的表现层web工程。
搭建
搭建taotao-sso
创建工程
创建聚合工程父工程
创建聚合工程子工程-interface
创建聚合工程子工程-service
加入依赖(就是pom.xml文件中的代码)
这里依赖的那个parent的包下的xml文件也一并提供下,建工程的过程就不写了,参见taotao-sso
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.taotao</groupId> 4 <artifactId>taotao-parent</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <packaging>pom</packaging> 7 8 <!-- 集中定义依赖版本号 --> 9 <properties> 10 <junit.version>4.12</junit.version> 11 <spring.version>4.1.3.RELEASE</spring.version> 12 <mybatis.version>3.2.7</mybatis.version> 13 <mybatis.spring.version>1.2.2</mybatis.spring.version> 14 <mybatis.paginator.version>1.2.15</mybatis.paginator.version> 15 <mysql.version>5.1.32</mysql.version> 16 <slf4j.version>1.6.4</slf4j.version> 17 <jackson.version>2.4.2</jackson.version> 18 <druid.version>1.0.9</druid.version> 19 <jolbox.version>0.8.0.RELEASE</jolbox.version> 20 <jstl.version>1.2</jstl.version> 21 <servlet-api.version>2.5</servlet-api.version> 22 <jsp-api.version>2.0</jsp-api.version> 23 <joda-time.version>2.5</joda-time.version> 24 <commons-lang3.version>3.3.2</commons-lang3.version> 25 <commons-io.version>1.3.2</commons-io.version> 26 <commons-net.version>3.3</commons-net.version> 27 <pagehelper.version>3.7.5</pagehelper.version> 28 <mapper.version>2.3.4</mapper.version> 29 <jsqlparser.version>0.9.1</jsqlparser.version> 30 <commons-fileupload.version>1.3.1</commons-fileupload.version> 31 <commons-codec.version>1.9</commons-codec.version> 32 <jedis.version>2.7.2</jedis.version> 33 <solrj.version>4.10.3</solrj.version> 34 <dubbo.version>2.5.3</dubbo.version> 35 <zookeeper.version>3.4.7</zookeeper.version> 36 <zkclient.version>0.1</zkclient.version> 37 <activemq.version>5.12.0</activemq.version> 38 <freemarker.version>2.3.23</freemarker.version> 39 <quartz.version>2.2.2</quartz.version> 40 </properties> 41 42 <dependencies> 43 <!-- 单元测试 --> 44 <dependency> 45 <groupId>junit</groupId> 46 <artifactId>junit</artifactId> 47 <version>${junit.version}</version> 48 <scope>test</scope> 49 </dependency> 50 51 <!-- Spring --> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-webmvc</artifactId> 55 <version>${spring.version}</version> 56 </dependency> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-jdbc</artifactId> 60 <version>${spring.version}</version> 61 </dependency> 62 <dependency> 63 <groupId>org.springframework</groupId> 64 <artifactId>spring-aspects</artifactId> 65 <version>${spring.version}</version> 66 </dependency> 67 <dependency> 68 <groupId>org.springframework</groupId> 69 <artifactId>spring-context-support</artifactId> 70 <version>${spring.version}</version> 71 </dependency> 72 73 <!-- Mybatis --> 74 <dependency> 75 <groupId>org.mybatis</groupId> 76 <artifactId>mybatis</artifactId> 77 <version>${mybatis.version}</version> 78 </dependency> 79 <dependency> 80 <groupId>org.mybatis</groupId> 81 <artifactId>mybatis-spring</artifactId> 82 <version>${mybatis.spring.version}</version> 83 </dependency> 84 85 <!-- 通用Mapper --> 86 <dependency> 87 <groupId>com.github.abel533</groupId> 88 <artifactId>mapper</artifactId> 89 <version>${mapper.version}</version> 90 </dependency> 91 92 <!-- 分页助手 --> 93 <dependency> 94 <groupId>com.github.pagehelper</groupId> 95 <artifactId>pagehelper</artifactId> 96 <version>${pagehelper.version}</version> 97 </dependency> 98 <dependency> 99 <groupId>com.github.jsqlparser</groupId> 100 <artifactId>jsqlparser</artifactId> 101 <version>${jsqlparser.version}</version> 102 </dependency> 103 104 <!-- MySql --> 105 <dependency> 106 <groupId>mysql</groupId> 107 <artifactId>mysql-connector-java</artifactId> 108 <version>${mysql.version}</version> 109 </dependency> 110 111 <!-- 日志 --> 112 <dependency> 113 <groupId>org.slf4j</groupId> 114 <artifactId>slf4j-log4j12</artifactId> 115 <version>${slf4j.version}</version> 116 </dependency> 117 118 <!-- Jackson Json处理工具包 --> 119 <dependency> 120 <groupId>com.fasterxml.jackson.core</groupId> 121 <artifactId>jackson-databind</artifactId> 122 <version>${jackson.version}</version> 123 </dependency> 124 125 <!-- 连接池 --> 126 <dependency> 127 <groupId>com.jolbox</groupId> 128 <artifactId>bonecp-spring</artifactId> 129 <version>${jolbox.version}</version> 130 </dependency> 131 132 <!-- JSP相关 --> 133 <dependency> 134 <groupId>jstl</groupId> 135 <artifactId>jstl</artifactId> 136 <version>${jstl.version}</version> 137 </dependency> 138 <dependency> 139 <groupId>javax.servlet</groupId> 140 <artifactId>servlet-api</artifactId> 141 <version>${servlet-api.version}</version> 142 <scope>provided</scope> 143 </dependency> 144 <dependency> 145 <groupId>javax.servlet</groupId> 146 <artifactId>jsp-api</artifactId> 147 <version>${jsp-api.version}</version> 148 <scope>provided</scope> 149 </dependency> 150 151 <!-- 时间操作组件 --> 152 <dependency> 153 <groupId>joda-time</groupId> 154 <artifactId>joda-time</artifactId> 155 <version>${joda-time.version}</version> 156 </dependency> 157 158 <!-- Apache工具组件 --> 159 <dependency> 160 <groupId>org.apache.commons</groupId> 161 <artifactId>commons-lang3</artifactId> 162 <version>${commons-lang3.version}</version> 163 </dependency> 164 <dependency> 165 <groupId>org.apache.commons</groupId> 166 <artifactId>commons-io</artifactId> 167 <version>${commons-io.version}</version> 168 </dependency> 169 170 <!-- 文件上传组件 --> 171 <dependency> 172 <groupId>commons-fileupload</groupId> 173 <artifactId>commons-fileupload</artifactId> 174 <version>${commons-fileupload.version}</version> 175 </dependency> 176 177 <!-- dubbo相关 --> 178 <dependency> 179 <groupId>com.alibaba</groupId> 180 <artifactId>dubbo</artifactId> 181 <version>${dubbo.version}</version> 182 <exclusions> 183 <exclusion> 184 <groupId>org.springframework</groupId> 185 <artifactId>spring</artifactId> 186 </exclusion> 187 <exclusion> 188 <groupId>org.jboss.netty</groupId> 189 <artifactId>netty</artifactId> 190 </exclusion> 191 </exclusions> 192 </dependency> 193 <dependency> 194 <groupId>org.apache.zookeeper</groupId> 195 <artifactId>zookeeper</artifactId> 196 <version>${zookeeper.version}</version> 197 </dependency> 198 <dependency> 199 <groupId>com.github.sgroschupf</groupId> 200 <artifactId>zkclient</artifactId> 201 <version>${zkclient.version}</version> 202 </dependency> 203 204 <!-- 加密解密 --> 205 <dependency> 206 <groupId>commons-codec</groupId> 207 <artifactId>commons-codec</artifactId> 208 <version>${commons-codec.version}</version> 209 </dependency> 210 211 <!-- 定时任务Quartz --> 212 <dependency> 213 <groupId>org.quartz-scheduler</groupId> 214 <artifactId>quartz</artifactId> 215 <version>2.2.1</version> 216 </dependency> 217 218 <!-- ActiveMQ依赖 --> 219 <dependency> 220 <groupId>org.apache.activemq</groupId> 221 <artifactId>activemq-all</artifactId> 222 <version>${activemq.version}</version> 223 </dependency> 224 <dependency> 225 <groupId>org.springframework</groupId> 226 <artifactId>spring-jms</artifactId> 227 <version>${spring.version}</version> 228 </dependency> 229 230 <!-- 静态化freemarker --> 231 <dependency> 232 <groupId>org.freemarker</groupId> 233 <artifactId>freemarker</artifactId> 234 <version>${freemarker.version}</version> 235 </dependency> 236 237 <!-- Redis客户端 --> 238 <dependency> 239 <groupId>redis.clients</groupId> 240 <artifactId>jedis</artifactId> 241 <version>${jedis.version}</version> 242 </dependency> 243 244 <!-- solr客户端 --> 245 <dependency> 246 <groupId>org.apache.solr</groupId> 247 <artifactId>solr-solrj</artifactId> 248 <version>${solrj.version}</version> 249 </dependency> 250 251 </dependencies> 252 253 <build> 254 <finalName>${project.artifactId}</finalName> 255 <plugins> 256 <!-- 资源文件拷贝插件 --> 257 <plugin> 258 <groupId>org.apache.maven.plugins</groupId> 259 <artifactId>maven-resources-plugin</artifactId> 260 <version>2.7</version> 261 <configuration> 262 <encoding>UTF-8</encoding> 263 </configuration> 264 </plugin> 265 <!-- java编译插件 --> 266 <plugin> 267 <groupId>org.apache.maven.plugins</groupId> 268 <artifactId>maven-compiler-plugin</artifactId> 269 <version>3.2</version> 270 <configuration> 271 <source>1.7</source> 272 <target>1.7</target> 273 <encoding>UTF-8</encoding> 274 </configuration> 275 </plugin> 276 </plugins> 277 <pluginManagement> 278 <plugins> 279 <!-- 配置Tomcat插件 --> 280 <plugin> 281 <groupId>org.apache.tomcat.maven</groupId> 282 <artifactId>tomcat7-maven-plugin</artifactId> 283 <version>2.2</version> 284 </plugin> 285 </plugins> 286 </pluginManagement> 287 <resources> 288 <!-- 使用Maven部署的时候,xml和properties配置文件也一起部署到Tomcat --> 289 <resource> 290 <directory>src/main/java</directory> 291 <includes> 292 <include>**/*.properties</include> 293 <include>**/*.xml</include> 294 </includes> 295 <filtering>false</filtering> 296 </resource> 297 <!-- 默认是以下配置 --> 298 <resource> 299 <directory>src/main/resources</directory> 300 <includes> 301 <include>**/*.properties</include> 302 <include>**/*.xml</include> 303 </includes> 304 <filtering>false</filtering> 305 </resource> 306 </resources> 307 </build> 308 </project>
taotao-sso
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <parent> 5 <groupId>com.taotao</groupId> 6 <artifactId>taotao-parent</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 </parent> 9 <groupId>com.taotao</groupId> 10 <artifactId>taotao-sso</artifactId> 11 <version>0.0.1-SNAPSHOT</version> 12 <packaging>pom</packaging> 13 <modules> 14 <module>taotao-sso-interface</module> 15 <module>taotao-sso-service</module> 16 </modules> 17 18 <build> 19 <plugins> 20 <!-- 配置Tomcat插件 --> 21 <plugin> 22 <groupId>org.apache.tomcat.maven</groupId> 23 <artifactId>tomcat7-maven-plugin</artifactId> 24 <configuration> 25 <port>8082</port> 26 <path>/</path> 27 </configuration> 28 </plugin> 29 </plugins> 30 </build> 31 </project>
taotao-sso-interface
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <parent> 5 <groupId>com.taotao</groupId> 6 <artifactId>taotao-sso</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 </parent> 9 <artifactId>taotao-sso-interface</artifactId> 10 <version>1.0.0-SNAPSHOT</version> 11 12 <dependencies> 13 <!-- 加入taotao-manager-pojo依赖 --> 14 <dependency> 15 <groupId>com.taotao</groupId> 16 <artifactId>taotao-manager-pojo</artifactId> 17 <version>1.0.0-SNAPSHOT</version> 18 </dependency> 19 </dependencies> 20 </project>
taotao-sso-service
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <parent> 5 <groupId>com.taotao</groupId> 6 <artifactId>taotao-sso</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 </parent> 9 <artifactId>taotao-sso-service</artifactId> 10 <version>1.0.0-SNAPSHOT</version> 11 <packaging>war</packaging> 12 13 <dependencies> 14 <!-- 加入taotao-manager-mapper依赖 --> 15 <dependency> 16 <groupId>com.taotao</groupId> 17 <artifactId>taotao-manager-mapper</artifactId> 18 <version>1.0.0-SNAPSHOT</version> 19 </dependency> 20 21 <!-- 加入taotao-sso-interface依赖 --> 22 <dependency> 23 <groupId>com.taotao</groupId> 24 <artifactId>taotao-sso-interface</artifactId> 25 <version>1.0.0-SNAPSHOT</version> 26 </dependency> 27 </dependencies> 28 </project>
加入配置文件
在taotao-service工程中,创建如图示目录和文件:
其中的各个文件的配置:
SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <!-- 配置通用mapper --> 8 <plugins> 9 10 <!-- com.github.pagehelper为PageHelper类所在包名 --> 11 <plugin interceptor="com.github.pagehelper.PageHelper"> 12 <property name="dialect" value="mysql" /> 13 <!-- 该参数默认为false --> 14 <!-- 设置为true时,使用RowBounds分页会进行count查询 --> 15 <property name="rowBoundsWithCount" value="true" /> 16 17 </plugin> 18 19 <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"> 20 <!--================================================ --> 21 <!--可配置参数说明(一般无需修改) --> 22 <!--================================================ --> 23 <!--UUID生成策略 --> 24 <!--配置UUID生成策略需要使用OGNL表达式 --> 25 <!--默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "") --> 26 <!--<property name="UUID" value="@java.util.UUID@randomUUID().toString()"/> --> 27 <!--主键自增回写方法,默认值MYSQL,详细说明请看文档 --> 28 <property name="IDENTITY" value="MYSQL" /> 29 <!--序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle --> 30 <!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName --> 31 <!-- <property name="seqFormat" value="{0}.nextval"/> --> 32 <!--主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER) --> 33 <!--<property name="ORDER" value="AFTER"/> --> 34 <!--通用Mapper接口,多个通用接口用逗号隔开 --> 35 <property name="mappers" value="com.github.abel533.mapper.Mapper" /> 36 </plugin> 37 38 39 40 </plugins> 41 42 43 </configuration>
jdbc.properties
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/数据库名 3 jdbc.username=root 4 jdbc.password=root
jedis.properties
1 #这里引用的是我的个人配置,各位读者请根据自己的配置自行修改自己的#reidis 的参数。默认使用的是单机版的,如果有想测试redis集群版的,可 2 #以通过我的博客查看如何配置。并在application.jedis 中进行修改 3 #配置redis单机版的参数 4 jedis.host=192.168.37.161 5 jedis.port=6379 6 7 #配置redis集群版的参数 8 cluster.host1=192.168.37.161 9 cluster.port1=7001 10 11 cluster.host2=192.168.37.161 12 cluster.port2=7002 13 14 cluster.host3=192.168.37.161 15 cluster.port3=7003 16 17 cluster.host4=192.168.37.161 18 cluster.port4=7004 19 20 cluster.host5=192.168.37.161 21 cluster.port5=7005 22 23 cluster.host6=192.168.37.161 24 cluster.port6=7006
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 id="MyWebApp" version="2.5"> 6 <display-name>taotao-sso</display-name> 7 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file> 10 </welcome-file-list> 11 12 <!-- spring --> 13 <context-param> 14 <param-name>contextConfigLocation</param-name> 15 <param-value>classpath:spring/applicationContext*.xml</param-value> 16 </context-param> 17 18 <!-- spring监听器 --> 19 <listener> 20 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 21 </listener> 22 23 </web-app>
applicationContext-dao.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 9 10 <!-- 配置 读取properties文件 jdbc.properties --> 11 <context:property-placeholder location="classpath:*.properties" /> 12 13 <!-- 配置数据源 --> 14 <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" 15 destroy-method="close"> 16 <!-- 数据库驱动 --> 17 <property name="driverClass" value="${jdbc.driver}" /> 18 <!-- 相应驱动的jdbcUrl --> 19 <property name="jdbcUrl" value="${jdbc.url}" /> 20 <!-- 数据库的用户名 --> 21 <property name="username" value="${jdbc.username}" /> 22 <!-- 数据库的密码 --> 23 <property name="password" value="${jdbc.password}" /> 24 <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 --> 25 <property name="idleConnectionTestPeriod" value="60" /> 26 <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 --> 27 <property name="idleMaxAge" value="30" /> 28 <!-- 每个分区最大的连接数 --> 29 <property name="maxConnectionsPerPartition" value="150" /> 30 <!-- 每个分区最小的连接数 --> 31 <property name="minConnectionsPerPartition" value="5" /> 32 </bean> 33 34 <!-- 配置SqlSession会话工厂 --> 35 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 36 <!-- 配置数据源 --> 37 <property name="dataSource" ref="dataSource" /> 38 <!-- 配置mybatis全局配置文件 --> 39 <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> 40 </bean> 41 42 <!-- 配置Mapper扫描 --> 43 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 44 <!-- 配置扫描的包 --> 45 <property name="basePackage" value="com.taotao.manager.mapper" /> 46 </bean> 47 </beans>
applicationContext-jedis.xml
1 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 2 xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" 3 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 5 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 6 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 8 9 <!-- 配置jedisPool --> 10 <bean class="redis.clients.jedis.JedisPool"> 11 <constructor-arg name="host" value="${jedis.host}" /> 12 <constructor-arg name="port" value="${jedis.port}" /> 13 </bean> 14 15 <!-- 配置jedisCluster --> 16 <bean class="redis.clients.jedis.JedisCluster"> 17 <!-- 配置的集群节点信息 --> 18 <constructor-arg name="nodes"> 19 <set> 20 <bean class="redis.clients.jedis.HostAndPort"> 21 <constructor-arg name="host" value="${cluster.host1}" /> 22 <constructor-arg name="port" value="${cluster.port1}" /> 23 </bean> 24 <bean class="redis.clients.jedis.HostAndPort"> 25 <constructor-arg name="host" value="${cluster.host2}" /> 26 <constructor-arg name="port" value="${cluster.port2}" /> 27 </bean> 28 <bean class="redis.clients.jedis.HostAndPort"> 29 <constructor-arg name="host" value="${cluster.host3}" /> 30 <constructor-arg name="port" value="${cluster.port3}" /> 31 </bean> 32 <bean class="redis.clients.jedis.HostAndPort"> 33 <constructor-arg name="host" value="${cluster.host4}" /> 34 <constructor-arg name="port" value="${cluster.port4}" /> 35 </bean> 36 <bean class="redis.clients.jedis.HostAndPort"> 37 <constructor-arg name="host" value="${cluster.host5}" /> 38 <constructor-arg name="port" value="${cluster.port5}" /> 39 </bean> 40 <bean class="redis.clients.jedis.HostAndPort"> 41 <constructor-arg name="host" value="${cluster.host6}" /> 42 <constructor-arg name="port" value="${cluster.port6}" /> 43 </bean> 44 </set> 45 </constructor-arg> 46 </bean> 47 48 <!-- 配置redis单机版实现 --> 49 <bean id="jedisPoolUtils" class="com.taotao.sso.redis.impl.JedisPoolUtils" /> 50 51 <!-- 配置redis集群版实现 --> 52 <!-- <bean id="jedisClusterUtils" class="com.taotao.sso.redis.impl.JedisClusterUtils" /> --> 53 </beans>
对了,还需要引入之前的redis中写的工具类的包。其实大家可以试着自己写一下,很简单的不过我还是提供下代码:建立的包结构如下:
JedisClusterUtiles.java
1 package com.taotao.manager.redis.impl; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 5 import com.taotao.manager.redis.RedisUtils; 6 7 import redis.clients.jedis.JedisCluster; 8 9 /** 10 * 集群版redis 11 * @author Administrator 12 * 13 */ 14 public class RedisCluster implements RedisUtils { 15 16 @Autowired 17 private JedisCluster jedisCluster; 18 19 @Override 20 public void set(String key, String value) { 21 this.jedisCluster.set(key, value); 22 } 23 24 @Override 25 public String get(String key) { 26 String result = this.jedisCluster.get(key); 27 return result; 28 } 29 30 @Override 31 public void del(String key) { 32 this.jedisCluster.del(key); 33 } 34 35 @Override 36 public void expire(String key, Integer seconds) { 37 this.jedisCluster.expire(key, seconds); 38 } 39 40 @Override 41 public void set(String key, String value, Integer seconds) { 42 this.jedisCluster.set(key, value); 43 this.jedisCluster.expire(key, seconds); 44 } 45 46 @Override 47 public Long incr(String key) { 48 Long count = this.jedisCluster.incr(key); 49 return count; 50 } 51 }
JedisPoolUtils.java
1 package com.taotao.manager.redis.impl; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 5 import com.taotao.manager.redis.RedisUtils; 6 7 import redis.clients.jedis.Jedis; 8 import redis.clients.jedis.JedisPool; 9 10 /** 11 * 单机版redis实现 12 * @author Administrator 13 * 14 */ 15 public class RedisPool implements RedisUtils { 16 17 @Autowired 18 private JedisPool jedisPool; 19 20 @Override 21 public void set(String key, String value) { 22 Jedis jedis = this.jedisPool.getResource(); 23 24 jedis.set(key, value); 25 jedis.close(); 26 } 27 28 @Override 29 public String get(String key) { 30 Jedis jedis = this.jedisPool.getResource(); 31 32 String result = jedis.get(key); 33 jedis.close(); 34 35 return result; 36 } 37 38 @Override 39 public void del(String key) { 40 Jedis jedis = this.jedisPool.getResource(); 41 42 jedis.del(key); 43 jedis.close(); 44 45 } 46 47 @Override 48 public void expire(String key, Integer seconds) { 49 Jedis jedis = this.jedisPool.getResource(); 50 51 jedis.expire(key, seconds); 52 jedis.close(); 53 54 } 55 56 @Override 57 public void set(String key, String value, Integer seconds) { 58 Jedis jedis = this.jedisPool.getResource(); 59 60 jedis.set(key, value); 61 jedis.expire(key, seconds); 62 jedis.close(); 63 64 } 65 66 @Override 67 public Long incr(String key) { 68 Jedis jedis = this.jedisPool.getResource(); 69 70 Long count = jedis.incr(key); 71 jedis.close(); 72 73 return count; 74 } 75 }
RedisUtils.java
1 package com.taotao.manager.redis; 2 public interface RedisUtils{ 3 /** 4 * 保存 5 * 6 * @param key 7 * @param value 8 */ 9 public void set(String key, String value); 10 11 /** 12 * 根据key查询 13 * 14 * @param key 15 * @return 16 */ 17 public String get(String key); 18 19 /** 20 * 删除 21 * 22 * @param key 23 */ 24 public void del(String key); 25 26 /** 27 * 根据key设置生存时间 28 * 29 * @param key 30 * @param seconds 31 */ 32 public void expire(String key, Integer seconds); 33 34 /** 35 * 保存并设置生存时间 36 * 37 * @param key 38 * @param value 39 * @param seconds 40 */ 41 public void set(String key, String value, Integer seconds); 42 43 /** 44 * value加一 45 * 46 * @param key 47 * @return 48 */ 49 public Long incr(String key); 50 51 }
applicationContext-serivce.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 <!-- 配置service扫描 --> 12 <context:component-scan base-package="com.taotao.sso.service" /> 13 14 <!-- 提供方应用信息,用于计算依赖关系 --> 15 <dubbo:application name="taotao-sso-service" /> 16 17 <!-- 使用multicast广播注册中心暴露服务地址 --> 18 <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> 19 <!-- <dubbo:registry address="N/A" /> --> 20 <dubbo:registry protocol="zookeeper" address="192.168.37.161:2181" /> 21 22 <!-- 用dubbo协议在20880端口暴露服务 --> 23 <dubbo:protocol name="dubbo" port="20881" /> 24 25 <!-- 声明需要暴露的服务接口 --> 26 <!-- <dubbo:service interface="com.taotao.content.service.ContentCategoryService" --> 27 <!-- ref="contentCategoryServiceImpl" /> --> 28 29 </beans>
applicationContext-trans.xml
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 3 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 6 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 8 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 9 10 <!-- 定义事务管理器 --> 11 <bean id="transactionManager" 12 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 13 <property name="dataSource" ref="dataSource" /> 14 </bean> 15 16 <!-- 定义事务策略 --> 17 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 18 <tx:attributes> 19 <!-- 传播行为 --> 20 <tx:method name="save*" propagation="REQUIRED" /> 21 <tx:method name="insert*" propagation="REQUIRED" /> 22 <tx:method name="add*" propagation="REQUIRED" /> 23 <tx:method name="create*" propagation="REQUIRED" /> 24 <tx:method name="delete*" propagation="REQUIRED" /> 25 <tx:method name="update*" propagation="REQUIRED" /> 26 <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> 27 <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> 28 <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> 29 <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> 30 </tx:attributes> 31 </tx:advice> 32 33 <aop:config> 34 <!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型, 35 这里星号表明匹配所有返回类型。 com.abc.dao.*.*(..)表明匹配cn.itcast.mybatis.service包下的所有类的所有 36 方法 --> 37 <aop:pointcut id="myPointcut" expression="execution(* com.taotao.sso.service.*.*(..))" /> 38 <!--将定义好的事务处理策略应用到上述的切入点 --> 39 <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /> 40 </aop:config> 41 </beans>
搭建taotao-sso-web
创建工程
加入依赖
pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <parent> 5 <groupId>com.taotao</groupId> 6 <artifactId>taotao-parent</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 </parent> 9 <groupId>com.taotao</groupId> 10 <artifactId>taotao-sso-web</artifactId> 11 <version>1.0.0-SNAPSHOT</version> 12 <packaging>war</packaging> 13 14 <dependencies> 15 <!-- 加入taotao-sso-interface依赖 --> 16 <dependency> 17 <groupId>com.taotao</groupId> 18 <artifactId>taotao-sso-interface</artifactId> 19 <version>1.0.0-SNAPSHOT</version> 20 </dependency> 21 </dependencies> 22 23 <build> 24 <plugins> 25 <!-- 配置Tomcat插件 --> 26 <plugin> 27 <groupId>org.apache.tomcat.maven</groupId> 28 <artifactId>tomcat7-maven-plugin</artifactId> 29 <configuration> 30 <port>8085</port> 31 <path>/</path> 32 </configuration> 33 </plugin> 34 </plugins> 35 </build> 36 </project>
加入配置文件
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 id="MyWebApp" version="2.5"> 6 <display-name>taotao-sso-web</display-name> 7 8 <welcome-file-list> 9 <welcome-file>index.html</welcome-file> 10 </welcome-file-list> 11 12 <!-- 配置解决post提交乱码的问题 --> 13 <filter> 14 <filter-name>encoding</filter-name> 15 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 16 <init-param> 17 <param-name>encoding</param-name> 18 <param-value>UTF-8</param-value> 19 </init-param> 20 </filter> 21 <filter-mapping> 22 <filter-name>encoding</filter-name> 23 <url-pattern>/*</url-pattern> 24 </filter-mapping> 25 26 <!-- 配置springMVC --> 27 <servlet> 28 <servlet-name>taotao-sso-web</servlet-name> 29 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 30 <!-- 设置springMVC配置文件 --> 31 <init-param> 32 <param-name>contextConfigLocation</param-name> 33 <param-value>classpath:spring/springmvc.xml</param-value> 34 </init-param> 35 <load-on-startup>1</load-on-startup> 36 </servlet> 37 38 <!-- 配置springMVC映射 --> 39 <servlet-mapping> 40 <servlet-name>taotao-sso-web</servlet-name> 41 <!-- 所有的请求进入springMVC --> 42 <url-pattern>/</url-pattern> 43 </servlet-mapping> 44 45 </web-app>
springmvc.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 <!-- 加入properties配置文件 --> 12 <context:property-placeholder location="classpath:resource/*.properties" /> 13 14 <!-- 配置注解驱动 --> 15 <mvc:annotation-driven /> 16 17 <!-- 配置controller扫描 --> 18 <context:component-scan base-package="com.taotao.sso.controller" /> 19 20 <!-- 配置dubbo服务 --> 21 <dubbo:application name="taotao-sso-web" /> 22 23 <!-- 使用广播 --> 24 <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> 25 <dubbo:registry protocol="zookeeper" address="192.168.37.161:2181" /> 26 27 <!-- 声明要调用的服务,timeout是设置连接超时最长时间,如果不设置,超时时间默认是3秒 --> 28 <!-- <dubbo:reference interface="com.taotao.content.service.ContentService" --> 29 <!-- id="contentService" timeout="1000000" /> --> 30 31 </beans>