单点登录系统

1 通用页面跳转

1.1 业务分析

1.注册的url地址

http://www.jt.com/user/register.html

2.登录的url地址

http://www.jt.com/user/login.html

1.2 编辑UserController

package com.jt.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller //由于设计到页面跳转功能.
@RequestMapping("/user")
public class UserController {

    /**
     * 通用页面跳转实现
     * 1.http://www.jt.com/user/login.html       login.jsp页面
     * 2.http://www.jt.com/user/register.html    register.jsp页面
     */
    @RequestMapping("/{moduleName}")
    public String module(@PathVariable String moduleName){

        return moduleName;
    }

}

1.3 页面效果展现

在这里插入图片描述

2 创建JT-SSO项目

2.1 JT-SSO项目说明

作用:主要为jt-web的服务器提供用户的数据的支持,但凡涉及到user的CRUD操作都应该由该系统完成.
打包方式: jar包程序
注意事项: 继承jt/ 依赖jt-common 添加插件.
端口号: 8093
在这里插入图片描述

2.2 创建项目

在这里插入图片描述

2.3 编辑pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <artifactId>jt-sso</artifactId>

    <parent>
        <artifactId>jt</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!--添加依赖项-->
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--添加插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.4 编辑User的POJO对象

@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{

    @TableId(type = IdType.AUTO)    //主键自增
    private Long id;
    private String username;    //用户名
    private String password;    //密码
    private String phone;       //电话
    private String email;       //邮箱 由于email暂时没有使用电话代替

}

2.4 实现JT-SSO代码结构

在这里插入图片描述

2.5 编辑Nginx实现反向代理

注意hosts文件的配置. 修改nginx之后重启服务器.

#搭建jt-sso服务器
	server {
		listen 80;
		server_name sso.jt.com;

		location / {
			proxy_pass http://localhost:8093;
		}
	}

3 用户数据校验的分析

3.1 页面url分析

在这里插入图片描述

3.2 检索页面JS

在这里插入图片描述

3.3 页面JS分析

 $.ajax({
            	url : "http://sso.jt.com/user/check/"+escape(pin)+"/1?r=" + Math.random(),
            	dataType : "jsonp",
            	success : function(data) {      //状态信息:200 成功   状态信息:201 失败
                    checkpin = data.data?"1":"0";
                    if(data.status == 200){
                        if (!data.data) {
                            validateSettings.succeed.run(option);
                            namestate = true;
                        }else {
                            validateSettings.error.run(option, "该用户名已占用!");
                            namestate = false;
                        }
                    }else{
                        //标识后台服务器运行异常
                        validateSettings.error.run(option, "服务器正忙,请稍后!!!(我后台报错了我也不知道啥错!!!)");
                        namestate = false;
                    }
                }
            });

2.6 单点登录业务接口

在这里插入图片描述

2.7 编辑jt-sso的UserController

package com.jt.controller;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/findAll")
    public List<User> findAll(){

        return userService.findAll();
    }

    /**
     * JSONP的跨域请求  特殊的格式封装.....
     * 需求分析:校验用户的数据是否可用.
     * url: http://sso.jt.com/user/check/{param}/{type}
     * 参数: param/type
     * 返回值结果: SysResult对象
     */
    @RequestMapping("/check/{param}/{type}")
    public JSONPObject chcekUser(@PathVariable String param,
                                 @PathVariable Integer type,
                                 String callback){
        //根据信息查询数据库获取响应记录
        Boolean flag = userService.checkUser(param,type);
        return new JSONPObject(callback, SysResult.success(flag));
    }
}


2.8 编辑jt-sso的UserService

package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements  UserService{

    private static Map<Integer,String> paramMap = new HashMap<>();
    static {
        paramMap.put(1, "username");
        paramMap.put(2, "phone");
        paramMap.put(3, "email");
    }


    @Autowired
    private UserMapper userMapper;


    @Override
    public List<User> findAll() {

        return userMapper.selectList(null);
    }

    /**
     * 校验数据是否存在即可. 查询总记录数即可.
     * @param param   需要校验的数据
     * @param type    校验的类型 1username 2phone 3 email 6789910
     * @return
     */
    @Override
    public Boolean checkUser(String param, Integer type) {
        String column = paramMap.get(type);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(column, param);
        //boolean flag = userMapper.selectCount(queryWrapper)>0?true:false;
        return userMapper.selectCount(queryWrapper)>0;
    }
}


2.9 页面效果展现

在这里插入图片描述

2.10 修改全局异常处理机制

package com.jt.aop;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.vo.SysResult;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

@RestControllerAdvice   //作用: 标识我是一个通知方法,并且只拦截Controll层的异常.并且返回JSON.
public class SysResultException {

    //需要定义一个全局的方法 返回指定的报错信息.
    //ExceptionHandler 配置异常的类型,当遇到了某种异常时在执行该方法.
    //JSONP的异常处理应该是 callback({status:201,msg:"",data:""})
    //利用Request对象动态获取callback参数.之后动态封装返回值
    @ExceptionHandler(RuntimeException.class)
    public Object exception(Exception e, HttpServletRequest request){
        e.printStackTrace();
        String callback = request.getParameter("callback");
        if(!StringUtils.isEmpty(callback)){ //jsonp请求
            return new JSONPObject(callback, SysResult.fail());
        }
           //日志记录/控制台输出. 让程序员知道哪里报错!!!
        return SysResult.fail();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值