单点登录-系统搭建
之前说了单点登录系统的原理,这篇就来点硬货,说下单点登录的一个系统是如何搭建的。
架构分析
表现层:提供手机客户端,或其他系统的调用
表现层的存在意义就是,提供给所有非本系统的其他系统进行登录。具体实现的思路就是,编写一个登录的接口(本系统使用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
<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"> <modelVersion>4.0.0</modelVersion> <groupId>com.taotao</groupId> <artifactId>taotao-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 集中定义依赖版本号 --> <properties> <junit.version>4.12</junit.version> <spring.version>4.1.3.RELEASE</spring.version> <mybatis.version>3.2.7</mybatis.version> <mybatis.spring.version>1.2.2</mybatis.spring.version> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <mysql.version>5.1.32</mysql.version> <slf4j.version>1.6.4</slf4j.version> <jackson.version>2.4.2</jackson.version> <druid.version>1.0.9</druid.version> <jolbox.version>0.8.0.RELEASE</jolbox.version> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <joda-time.version>2.5</joda-time.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> <commons-net.version>3.3</commons-net.version> <pagehelper.version>3.7.5</pagehelper.version> <mapper.version>2.3.4</mapper.version> <jsqlparser.version>0.9.1</jsqlparser.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <commons-codec.version>1.9</commons-codec.version> <jedis.version>2.7.2</jedis.version> <solrj.version>4.10.3</solrj.version> <dubbo.version>2.5.3</dubbo.version> <zookeeper.version>3.4.7</zookeeper.version> <zkclient.version>0.1</zkclient.version> <activemq.version>5.12.0</activemq.version> <freemarker.version>2.3.23</freemarker.version> <quartz.version>2.2.2</quartz.version> </properties> <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <!-- 通用Mapper --> <dependency> <groupId>com.github.abel533</groupId> <artifactId>mapper</artifactId> <version>${mapper.version}</version> </dependency> <!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>${jsqlparser.version}</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp-spring</artifactId> <version>${jolbox.version}</version> </dependency> <!-- JSP相关 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </dependency> <!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- Apache工具组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <!-- dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>${zkclient.version}</version> </dependency> <!-- 加密解密 --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commons-codec.version}</version> </dependency> <!-- 定时任务Quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <!-- ActiveMQ依赖 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <!-- 静态化freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>${solrj.version}</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </pluginManagement> <resources> <!-- 使用Maven部署的时候,xml和properties配置文件也一起部署到Tomcat --> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <!-- 默认是以下配置 --> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>View Code
taotao-sso
<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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.taotao</groupId> <artifactId>taotao-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.taotao</groupId> <artifactId>taotao-sso</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>taotao-sso-interface</module> <module>taotao-sso-service</module> </modules> <build> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8082</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project>View Code
taotao-sso-interface
<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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.taotao</groupId> <artifactId>taotao-sso</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>taotao-sso-interface</artifactId> <version>1.0.0-SNAPSHOT</version> <dependencies> <!-- 加入taotao-manager-pojo依赖 --> <dependency> <groupId>com.taotao</groupId> <artifactId>taotao-manager-pojo</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> </project>View Code
taotao-sso-service
<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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.taotao</groupId> <artifactId>taotao-sso</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>taotao-sso-service</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- 加入taotao-manager-mapper依赖 --> <dependency> <groupId>com.taotao</groupId> <artifactId>taotao-manager-mapper</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> <!-- 加入taotao-sso-interface依赖 --> <dependency> <groupId>com.taotao</groupId> <artifactId>taotao-sso-interface</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> </project>View Code
加入配置文件
在taotao-service工程中,创建如图示目录和文件:
其中的各个文件的配置:
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置通用mapper --> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql" /> <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 --> <property name="rowBoundsWithCount" value="true" /> </plugin> <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"> <!--================================================ --> <!--可配置参数说明(一般无需修改) --> <!--================================================ --> <!--UUID生成策略 --> <!--配置UUID生成策略需要使用OGNL表达式 --> <!--默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "") --> <!--<property name="UUID" value="@java.util.UUID@randomUUID().toString()"/> --> <!--主键自增回写方法,默认值MYSQL,详细说明请看文档 --> <property name="IDENTITY" value="MYSQL" /> <!--序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle --> <!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName --> <!-- <property name="seqFormat" value="{0}.nextval"/> --> <!--主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER) --> <!--<property name="ORDER" value="AFTER"/> --> <!--通用Mapper接口,多个通用接口用逗号隔开 --> <property name="mappers" value="com.github.abel533.mapper.Mapper" /> </plugin> </plugins> </configuration>View Code
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/数据库名 jdbc.username=root jdbc.password=rootView Code
jedis.properties
#这里引用的是我的个人配置,各位读者请根据自己的配置自行修改自己的#reidis 的参数。默认使用的是单机版的,如果有想测试redis集群版的,可 #以通过我的博客查看如何配置。并在application.jedis 中进行修改 #配置redis单机版的参数 jedis.host=192.168.37.161 jedis.port=6379 #配置redis集群版的参数 cluster.host1=192.168.37.161 cluster.port1=7001 cluster.host2=192.168.37.161 cluster.port2=7002 cluster.host3=192.168.37.161 cluster.port3=7003 cluster.host4=192.168.37.161 cluster.port4=7004 cluster.host5=192.168.37.161 cluster.port5=7005 cluster.host6=192.168.37.161 cluster.port6=7006View Code
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="MyWebApp" version="2.5"> <display-name>taotao-sso</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext*.xml</param-value> </context-param> <!-- spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>View Code
applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置 读取properties文件 jdbc.properties --> <context:property-placeholder location="classpath:*.properties" /> <!-- 配置数据源 --> <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <!-- 数据库驱动 --> <property name="driverClass" value="${jdbc.driver}" /> <!-- 相应驱动的jdbcUrl --> <property name="jdbcUrl" value="${jdbc.url}" /> <!-- 数据库的用户名 --> <property name="username" value="${jdbc.username}" /> <!-- 数据库的密码 --> <property name="password" value="${jdbc.password}" /> <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 --> <property name="idleMaxAge" value="30" /> <!-- 每个分区最大的连接数 --> <property name="maxConnectionsPerPartition" value="150" /> <!-- 每个分区最小的连接数 --> <property name="minConnectionsPerPartition" value="5" /> </bean> <!-- 配置SqlSession会话工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 配置数据源 --> <property name="dataSource" ref="dataSource" /> <!-- 配置mybatis全局配置文件 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> </bean> <!-- 配置Mapper扫描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置扫描的包 --> <property name="basePackage" value="com.taotao.manager.mapper" /> </bean> </beans>View Code
applicationContext-jedis.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 配置jedisPool --> <bean class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="${jedis.host}" /> <constructor-arg name="port" value="${jedis.port}" /> </bean> <!-- 配置jedisCluster --> <bean class="redis.clients.jedis.JedisCluster"> <!-- 配置的集群节点信息 --> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host1}" /> <constructor-arg name="port" value="${cluster.port1}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host2}" /> <constructor-arg name="port" value="${cluster.port2}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host3}" /> <constructor-arg name="port" value="${cluster.port3}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host4}" /> <constructor-arg name="port" value="${cluster.port4}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host5}" /> <constructor-arg name="port" value="${cluster.port5}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host6}" /> <constructor-arg name="port" value="${cluster.port6}" /> </bean> </set> </constructor-arg> </bean> <!-- 配置redis单机版实现 --> <bean id="jedisPoolUtils" class="com.taotao.sso.redis.impl.JedisPoolUtils" /> <!-- 配置redis集群版实现 --> <!-- <bean id="jedisClusterUtils" class="com.taotao.sso.redis.impl.JedisClusterUtils" /> --> </beans>View Code
对了,还需要引入之前的redis中写的工具类的包。其实大家可以试着自己写一下,很简单的不过我还是提供下代码:建立的包结构如下:
JedisClusterUtiles.java
package com.taotao.manager.redis.impl; import org.springframework.beans.factory.annotation.Autowired; import com.taotao.manager.redis.RedisUtils; import redis.clients.jedis.JedisCluster; /** * 集群版redis * @author Administrator * */ public class RedisCluster implements RedisUtils { @Autowired private JedisCluster jedisCluster; @Override public void set(String key, String value) { this.jedisCluster.set(key, value); } @Override public String get(String key) { String result = this.jedisCluster.get(key); return result; } @Override public void del(String key) { this.jedisCluster.del(key); } @Override public void expire(String key, Integer seconds) { this.jedisCluster.expire(key, seconds); } @Override public void set(String key, String value, Integer seconds) { this.jedisCluster.set(key, value); this.jedisCluster.expire(key, seconds); } @Override public Long incr(String key) { Long count = this.jedisCluster.incr(key); return count; } }View Code
JedisPoolUtils.java
package com.taotao.manager.redis.impl; import org.springframework.beans.factory.annotation.Autowired; import com.taotao.manager.redis.RedisUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * 单机版redis实现 * @author Administrator * */ public class RedisPool implements RedisUtils { @Autowired private JedisPool jedisPool; @Override public void set(String key, String value) { Jedis jedis = this.jedisPool.getResource(); jedis.set(key, value); jedis.close(); } @Override public String get(String key) { Jedis jedis = this.jedisPool.getResource(); String result = jedis.get(key); jedis.close(); return result; } @Override public void del(String key) { Jedis jedis = this.jedisPool.getResource(); jedis.del(key); jedis.close(); } @Override public void expire(String key, Integer seconds) { Jedis jedis = this.jedisPool.getResource(); jedis.expire(key, seconds); jedis.close(); } @Override public void set(String key, String value, Integer seconds) { Jedis jedis = this.jedisPool.getResource(); jedis.set(key, value); jedis.expire(key, seconds); jedis.close(); } @Override public Long incr(String key) { Jedis jedis = this.jedisPool.getResource(); Long count = jedis.incr(key); jedis.close(); return count; } }View Code
RedisUtils.java
package com.taotao.manager.redis; public interface RedisUtils{ /** * 保存 * * @param key * @param value */ public void set(String key, String value); /** * 根据key查询 * * @param key * @return */ public String get(String key); /** * 删除 * * @param key */ public void del(String key); /** * 根据key设置生存时间 * * @param key * @param seconds */ public void expire(String key, Integer seconds); /** * 保存并设置生存时间 * * @param key * @param value * @param seconds */ public void set(String key, String value, Integer seconds); /** * value加一 * * @param key * @return */ public Long incr(String key); }View Code
applicationContext-serivce.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置service扫描 --> <context:component-scan base-package="com.taotao.sso.service" /> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="taotao-sso-service" /> <!-- 使用multicast广播注册中心暴露服务地址 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <!-- <dubbo:registry address="N/A" /> --> <dubbo:registry protocol="zookeeper" address="192.168.37.161:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20881" /> <!-- 声明需要暴露的服务接口 --> <!-- <dubbo:service interface="com.taotao.content.service.ContentCategoryService" --> <!-- ref="contentCategoryServiceImpl" /> --> </beans>View Code
applicationContext-trans.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 定义事务策略 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 传播行为 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型, 这里星号表明匹配所有返回类型。 com.abc.dao.*.*(..)表明匹配cn.itcast.mybatis.service包下的所有类的所有 方法 --> <aop:pointcut id="myPointcut" expression="execution(* com.taotao.sso.service.*.*(..))" /> <!--将定义好的事务处理策略应用到上述的切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /> </aop:config> </beans>View Code
搭建taotao-sso-web
创建工程
加入依赖
pom.xml
<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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.taotao</groupId> <artifactId>taotao-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.taotao</groupId> <artifactId>taotao-sso-web</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- 加入taotao-sso-interface依赖 --> <dependency> <groupId>com.taotao</groupId> <artifactId>taotao-sso-interface</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8085</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project>View Code
加入配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="MyWebApp" version="2.5"> <display-name>taotao-sso-web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 配置解决post提交乱码的问题 --> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置springMVC --> <servlet> <servlet-name>taotao-sso-web</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 设置springMVC配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置springMVC映射 --> <servlet-mapping> <servlet-name>taotao-sso-web</servlet-name> <!-- 所有的请求进入springMVC --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>View Code
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加入properties配置文件 --> <context:property-placeholder location="classpath:resource/*.properties" /> <!-- 配置注解驱动 --> <mvc:annotation-driven /> <!-- 配置controller扫描 --> <context:component-scan base-package="com.taotao.sso.controller" /> <!-- 配置dubbo服务 --> <dubbo:application name="taotao-sso-web" /> <!-- 使用广播 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <dubbo:registry protocol="zookeeper" address="192.168.37.161:2181" /> <!-- 声明要调用的服务,timeout是设置连接超时最长时间,如果不设置,超时时间默认是3秒 --> <!-- <dubbo:reference interface="com.taotao.content.service.ContentService" --> <!-- id="contentService" timeout="1000000" /> --> </beans>View Code