【SSM分布式架构电商项目-21】SSO单点登录系统

为什么要使用单点登录系统?

之前实现的登录和注册是在同一个tomcat内部完成,我们现在的系统架构是每一个系统都是由一个团队进行维护,每个系统都是单独部署运行一个单独的tomcat,所以,不能将用户的登录信息保存到session中(多个tomcat的session是不能共享的),所以我们需要一个单独的系统来维护用户的登录信息。

单点登录系统(SSO)

【SSM分布式架构电商项目-21】SSO单点登录系统_第1张图片

登录流程

之前的登录流程

【SSM分布式架构电商项目-21】SSO单点登录系统_第2张图片

现在的登录流程

【SSM分布式架构电商项目-21】SSO单点登录系统_第3张图片

创建工程(taotao-sso)

创建工程

【SSM分布式架构电商项目-21】SSO单点登录系统_第4张图片

导入依赖

<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.0modelVersion>
  <parent>
        <groupId>com.taotao.parentgroupId>
        <artifactId>taotao-parentartifactId>
        <version>0.0.1-SNAPSHOTversion>
    parent>

  <groupId>com.taotao.ssogroupId>
  <artifactId>taotao-ssoartifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>warpackaging>

  <dependencies>
        <dependency>
            <groupId>com.taotao-commongroupId>
            <artifactId>taotao-commonartifactId>
            <version>0.0.1-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aspectsartifactId>
        dependency>

        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
        dependency>
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
        dependency>

        
        <dependency>
            <groupId>com.github.abel533groupId>
            <artifactId>mapperartifactId>
        dependency>

        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-log4j12artifactId>
        dependency>

        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
        dependency>

        
        <dependency>
            <groupId>com.jolboxgroupId>
            <artifactId>bonecp-springartifactId>
        dependency>

        
        <dependency>
            <groupId>jstlgroupId>
            <artifactId>jstlartifactId>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <scope>providedscope>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>jsp-apiartifactId>
            <scope>providedscope>
        dependency>

        
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-lang3artifactId>
        dependency>
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-ioartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            
            <plugin>
                <groupId>org.apache.tomcat.mavengroupId>
                <artifactId>tomcat7-maven-pluginartifactId>
                <configuration>
                    <port>8083port>
                    <path>/path>
                configuration>
            plugin>
        plugins>
    build>

project>

Web.xml

【SSM分布式架构电商项目-21】SSO单点登录系统_第5张图片


<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="WebApp_ID" version="2.5">
    <display-name>taotao-ssodisplay-name>

    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/applicationContext*.xmlparam-value>
    context-param>

    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    
    <filter>
        <filter-name>encodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>encodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <servlet>
        <servlet-name>taotao-ssoservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:spring/taotao-sso-servlet.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>

    <servlet-mapping>
        <servlet-name>taotao-ssoservlet-name>
        <url-pattern>*.htmlurl-pattern>
    servlet-mapping>


    <welcome-file-list>
        <welcome-file>index.htmlwelcome-file>
    welcome-file-list>

web-app>

SSM配置文件

【SSM分布式架构电商项目-21】SSO单点登录系统_第6张图片

导入静态页面

【SSM分布式架构电商项目-21】SSO单点登录系统_第7张图片

编写UserController

【SSM分布式架构电商项目-21】SSO单点登录系统_第8张图片

启动tomcat

【SSM分布式架构电商项目-21】SSO单点登录系统_第9张图片

配置hosts

【SSM分布式架构电商项目-21】SSO单点登录系统_第10张图片

配置nginx

【SSM分布式架构电商项目-21】SSO单点登录系统_第11张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第12张图片
发现,JS、CSS没有加载。

解决静态资源加载的问题

方案:
1、 将taotao-web中的js和css拷贝到taotao-sso中
a) 好处:简单、方便
b) 缺点:重复、对用户而言需要重复加载
2、 将taotao-sso中的引用指向www.taotao.com
a) 好处:对用户而言只需要加载一次即可
b) 缺点:修改页面

方案三:
需要通过nginx访问静态资源,JS、CSS、Image。

具体实现:
1、 使用新域名访问静态资源 static.taotao.com
a) 好处:避免携带一些无用的cookie
【SSM分布式架构电商项目-21】SSO单点登录系统_第13张图片
2、 拷贝JS和CSS到磁盘路径中:
【SSM分布式架构电商项目-21】SSO单点登录系统_第14张图片

3、 配置nginx
【SSM分布式架构电商项目-21】SSO单点登录系统_第15张图片

4、 测试:
【SSM分布式架构电商项目-21】SSO单点登录系统_第16张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第17张图片

表结构

【SSM分布式架构电商项目-21】SSO单点登录系统_第18张图片

接口文档(模板)

【SSM分布式架构电商项目-21】SSO单点登录系统_第19张图片

基础代码

创建POJO

【SSM分布式架构电商项目-21】SSO单点登录系统_第20张图片

创建Mapper

【SSM分布式架构电商项目-21】SSO单点登录系统_第21张图片

创建UserService

【SSM分布式架构电商项目-21】SSO单点登录系统_第22张图片

检测数据是否可用

Controller

【SSM分布式架构电商项目-21】SSO单点登录系统_第23张图片

Service

【SSM分布式架构电商项目-21】SSO单点登录系统_第24张图片

修改JS

【SSM分布式架构电商项目-21】SSO单点登录系统_第25张图片

测试:
【SSM分布式架构电商项目-21】SSO单点登录系统_第26张图片

日志
2015-11-19 11:09:57,870 [http-bio-8083-exec-2] [org.springframework.jdbc.datasource.DataSourceTransactionManager]-[DEBUG] Releasing JDBC Connection [ConnectionHandle{url=jdbc:mysql://127.0.0.1:3306/taotao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true, user=root, debugHandle=null, lastResetAgoInSec=0, lastUsedAgoInSec=0, creationTimeAgoInSec=0}] after transaction
2015-11-19 11:09:57,870 [http-bio-8083-exec-2] [org.springframework.jdbc.datasource.DataSourceUtils]-[DEBUG] Returning JDBC Connection to DataSource
2015-11-19 11:09:57,891 [http-bio-8083-exec-2] [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver]-[DEBUG] Resolving exception from handler [public org.springframework.http.ResponseEntity com.taotao.sso.controller.UserController.check(java.lang.String,java.lang.Integer)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
2015-11-19 11:09:57,893 [http-bio-8083-exec-2] [org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver]-[DEBUG] Resolving exception from handler [public org.springframework.http.ResponseEntity com.taotao.sso.controller.UserController.check(java.lang.String,java.lang.Integer)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
2015-11-19 11:09:57,893 [http-bio-8083-exec-2] [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver]-[DEBUG] Resolving exception from handler [public org.springframework.http.ResponseEntity com.taotao.sso.controller.UserController.check(java.lang.String,java.lang.Integer)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
2015-11-19 11:09:57,893 [http-bio-8083-exec-2] [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Null ModelAndView returned to DispatcherServlet with name 'taotao-sso': assuming HandlerAdapter completed request handling
2015-11-19 11:09:57,893 [http-bio-8083-exec-2] [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Successfully completed request

最终原因:
SpringMVC的规定:在SpringMVC中如果请求以html结尾,那么就不会返回JSON数据。

解决方案:(多条路进入SpringMVC)
【SSM分布式架构电商项目-21】SSO单点登录系统_第27张图片

测试:

【SSM分布式架构电商项目-21】SSO单点登录系统_第28张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第29张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第30张图片

Controller:
【SSM分布式架构电商项目-21】SSO单点登录系统_第31张图片

注册

前端JS

【SSM分布式架构电商项目-21】SSO单点登录系统_第32张图片

Controller

【SSM分布式架构电商项目-21】SSO单点登录系统_第33张图片

Service

【SSM分布式架构电商项目-21】SSO单点登录系统_第34张图片

使用Apache提供的加密解密工具进行MD5加密:
【SSM分布式架构电商项目-21】SSO单点登录系统_第35张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第36张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第37张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第38张图片

数据校验

在SpringMVC中实现数据校验:
【SSM分布式架构电商项目-21】SSO单点登录系统_第39张图片

在POJO中添加校验规则

【SSM分布式架构电商项目-21】SSO单点登录系统_第40张图片

在Controller中添加校验注解

【SSM分布式架构电商项目-21】SSO单点登录系统_第41张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第42张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第43张图片

登录

跳转到登录页面

【SSM分布式架构电商项目-21】SSO单点登录系统_第44张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第45张图片

提交事件

【SSM分布式架构电商项目-21】SSO单点登录系统_第46张图片

后台处理提交逻辑

Controller

【SSM分布式架构电商项目-21】SSO单点登录系统_第47张图片

Service

先通过用户名查询User对象,再对比密码是否相同。
【SSM分布式架构电商项目-21】SSO单点登录系统_第48张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第49张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第50张图片

忽略保存数据中的password

【SSM分布式架构电商项目-21】SSO单点登录系统_第51张图片
测试:
【SSM分布式架构电商项目-21】SSO单点登录系统_第52张图片

登录成功后没有写入cookie

问题:
【SSM分布式架构电商项目-21】SSO单点登录系统_第53张图片

获取到到的127.0.0.1,需要将cookie写入到taotao.com中,这样违反了浏览的安全的原则,导致写入失败。

解决方案:
只需要通过request对象获取到正确的地址(xxx.taotao.com)即可。

请求:用户请求 -> nginx -> tomcat,tomcat根本不知道真正的请求来源。

解决:
在nginx的配置文件中添加Host的代理头信息:
【SSM分布式架构电商项目-21】SSO单点登录系统_第54张图片

【SSM分布式架构电商项目-21】SSO单点登录系统_第55张图片

效果:
【SSM分布式架构电商项目-21】SSO单点登录系统_第56张图片

总结:
二级域名可以将cookie写入到主域名下。 A.taotao.com -> taotao.com
二级域名之间不能互相写入,a.taotao.com 不能写入到 b.taotao.com

显示当前登录人的用户名

前端JS

【SSM分布式架构电商项目-21】SSO单点登录系统_第57张图片

后端Controller

【SSM分布式架构电商项目-21】SSO单点登录系统_第58张图片

Service

【SSM分布式架构电商项目-21】SSO单点登录系统_第59张图片

添加跨域支持

【SSM分布式架构电商项目-21】SSO单点登录系统_第60张图片

测试

【SSM分布式架构电商项目-21】SSO单点登录系统_第61张图片

你可能感兴趣的:(SSM分布式架构电商项目)