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();
}
}