SSO对外系统Ajax请求无效,day78_淘淘商城项目_11_单点登录系统实现 + 用户名回显 + ajax请求跨域问题详解_匠心笔记...

本文详细介绍了SSO(Single Sign-On)系统的实现,包括注册、登录功能的开发,以及数据校验、ajax跨域请求的解决方案。通过检查数据可用性接口和用户注册、登录接口的实现,阐述了服务发布、引用和服务层的设计。同时,讨论了406错误的产生原因及解决方法。
摘要由CSDN通过智能技术生成

课程计划

1、SSO注册功能实现

2、SSO登录功能实现

3、通过token获得用户信息

4、ajax跨域请求解决方案--jsonp

1、服务接口实现

SSO系统就是解决分布式环境下登录问题的,本质上是解决分布式环境下Session共享问题。

1.1、检查数据是否可用接口开发

检查数据是否可用作为注册功能的辅助。

50mV1p.png

1.1.1、功能分析

请求的url:/user/check/{param}/{type}

参数:从url中取参数

1、String param(要校验的数据)

2、Integer type(校验的数据类型)

响应的数据:json数据。TaotaoResult,封装的数据校验的结果为true:表示成功,数据可用,false:失败,数据不可用。

业务逻辑:

1、从tb_user表中查询数据。

2、查询条件根据参数动态生成。

3、判断查询结果,如果查询到数据就返回false。

4、如果没有查询到数据就返回true。

5、使用TaotaoResult包装,并返回。

1.1.2、Dao

从tb_user表查询。属于单表查询,可以使用逆向工程生成的代码。

1.1.3、Service

先在taotao-sso-interface中定义接口UserRegisterService,

再在taotao-sso-service中写实现类。

参数:

1、要校验的数据:String param

2、数据类型:Integer type(1、2、3分别代表username、phone、email)

返回值:TaotaoResult

在taotao-sso-interface创建接口

#zs#*

* 用户注册管理接口

* @author chenmingjun

* @date 2018年12月3日 上午9:47:29

* @version V1.0

#fzs#

public interface UserRegisterService{

#zs#*

* 检查APP传过来的数据是否可用

* @param param 要校验的数据

* @param type 校验的数据类型

* @return

#fzs#

TaotaoResult checkData(String param, Integer type);

}

在taotao-sso-service创建实现类

@Autowired

private TbUserMapper tbUserMapper;

@Override

public TaotaoResult checkData(String param, Integer type) {

// 1、从tb_user表中查询数据

TbUserExample example = new TbUserExample();

Criteria criteria = example.createCriteria();

// 2、查询条件根据参数动态生成

// 1、2、3分别代表username、phone、email

if (type == 1) {

criteria.andUsernameEqualTo(param);

} else if (type == 2) {

criteria.andPhoneEqualTo(param);

} else if (type == 3) {

criteria.andEmailEqualTo(param);

} else {

return TaotaoResult.build(400, "非法的参数");

}

// 执行查询

List list = tbUserMapper.selectByExample(example);

// 3、判断查询结果,如果查询到数据就返回false

if (list == null || list.size() == 0) {

// 4、如果没有查询到数据就返回true

return TaotaoResult.ok(true);

}

// 5、使用TaotaoResult包装,并返回

return TaotaoResult.ok(false);

}

1.1.4、发布服务

先在taotao-sso-service工程中的pom.xml文件中配置对taotao-sso-interface的依赖,因为服务层发布服务要通过该接口,

再在taotao-sso-service工程中的applicationContext-service.xml文件中发布服务:

50mzp6.png

1.1.5、引用服务

需要在taotao-sso-web中实现。

先在taotao-sso-web工程中的pom.xml文件中配置对taotao-sso-interface的依赖,表现层调用服务要通过该接口,

在taotao-sso-web工程中的springmvc.xml文件中引用服务:

50mmBB.png

1.1.6、Controller

请求的url:/user/check/{param}/{type}

参数:从url中取参数

1、String param(要校验的数据)

2、Integer type(校验的数据类型)

请求的方法:get。

响应的数据:json数据。TaotaoResult,封装的数据校验的结果,true:成功;false:失败。

#zs#*

* 用户处理Controller

* @author chenmingjun

* @date 2018年12月3日 上午10:31:38

* @version V1.0

#fzs#

@Controller

public class UserController{

@Autowired

private UserRegisterService userRegisterService;

@RequestMapping(value="/user/check/{param}/{type}", method=RequestMethod.GET)

@ResponseBody

public TaotaoResult checkData(@PathVariable String param, @PathVariable Integer type) {

TaotaoResult result = userRegisterService.checkData(param, type);

return result;

}

}

1.1.7、测试

get请求好测试,直接在浏览器中输入URL即可。

访问地址:http://localhost:8088/user/check/zhangsan/1

浏览器报404错误,原因是:我们web.xml中配置的是拦截以“.html”为后缀的请求。

我们修改访问地址:http://localhost:8088/user/check/zhangsan/1.html

此时浏览器报406错误。原因如下图:

50mTkJ.png

而且如果我们在请求后面加上“.html”的话,等于我们修改了接口开发文档,这是不行的。

正确的做法是要拦截不带后缀的请求,我们使用“/”即拦截所有请求,如下图所示:

50mQdK.png

下面我们详解406错误的形成原因?

答:当我们浏览器出现406错误时,90%的原因是因为没有导入jackson-core-2.4.2.jar这个包。10%的原因是我们请求的URL后缀是“.html”。为什么呢?

原因是:在springMVC中使用注解@ResponseBody,springMVC认为对于后缀是“.html”的URL请求,服务端返回的应该也是一个html页面。但是如果服务端返回的是一个java对象的话,那么浏览器不能将一个java对象转换成一个html对象,即就会报406错误。(这是一个大坑!)

1.2、用户注册接口开发

1.2.1、功能分析

50mYq3.png

请求的url:/user/register

参数:表单的数据:username、password、phone、email

返回值:json数据。TaotaoResult。

接收参数:使用TbUser对象接收。

请求的方法:post

业务逻辑:

1、使用TbUser接收提交的请求。

2、补全TbUser其他属性。

3、密码要进行MD5加密。

4、把用户信息插入到数据库中。

5、返回TaotaoResult.ok()。

1.2.2、Dao

可以使用逆向工程生成的代码。

1.2.3、Service

在taotao-sso-interface中定义接口UserRegisterService已经定义好了,我们直接添加方法即可。

再在taotao-sso-service中写实现类,我们已经定义好了,直接实现方法即可。

参数:TbUser

返回值:TaotaoResult

在taotao-sso-interface创建接口

#zs#*

* 用户注册

* @param tbUser

* @return

#fzs#

TaotaoResult register(TbUser tbUser);

}

在taotao-sso-service创建实现类

@Override

public TaotaoResult register(TbUser tbUser) {

// 1、校验用户名和密码不能为空

if (StringUtils.isEmpty(tbUser.getUsername())) {

return TaotaoResult.build(400, "注册失败,请检验数据后再提交数据");

}

if (StringUtils.isEmpty(tbUser.getPassword())) {

return TaotaoResult.build(400, "注册失败,请检验数据后再提交数据");

}

// 2、校验数据的可用性

// 2.1 、校验username是否可用

TaotaoResult checkData = checkData(tbUser.getUsername(), 1);

if (!(boolean) checkData.getData()) { // 说明username不可用,返回400

return TaotaoResult.build(400, "该用户名已被注册");

}

// 2.2、校验phone是否可用

if (StringUtils.isNotBlank(tbUser.getPhone())) { // 说明phone不为空

if ((boolean) checkData.getData()) { // 说明phone不可用,返回400

return TaotaoResult.build(400, "该手机号已被注册");

}

}

// 2.3、校验email是否可用

if (StringUtils.isNotBlank(tbUser.getEmail())) { // 说明email不为空

if ((boolean) checkData.getData()) { // 说明email不可用,返回400

return TaotaoResult.build(400, "该邮箱已被注册");

}

}

// 补全TbUser其他属性

tbUser.setCreated(new Date());

tbUser.setUpdated(tbUser.getCreated());

// 密码的MD5加密处理

String password = tbUser.getPassword();

String md5Password = DigestUtils.md5DigestAsHex(password.getBytes());

tbUser.setPassword(md5Password);

// 把用户信息插入到数据库中

tbUserMapper.insertSelective(tbUser);

return TaotaoResult.ok();

}

1.2.4、发布服务

在taotao-sso-service工程中applicationContext-service.xml文件中发布服务,上面“1.1.4”中已经发布过了。不在赘图!

1.2.5、引用服务

在taotao-sso-web工程中的springmvc.xml文件中引用服务,上面“1.1.5”中已经引用过了。不在赘图!

1.2.6、Controller

请求的url:/user/register

参数:表单的数据:username、password、phone、email

返回值:json数据。TaotaoResult。

接收参数:使用TbUser对象接收。

请求的方法:post

@RequestMapping(value="/user/register", method=RequestMethod.POST)

@ResponseBody

public TaotaoResult register(TbUser tbUser) {

TaotaoResult result = userRegisterService.register(tbUser);

return result;

}

1.2.7、测试

post请求不好测试,需要我们新建表单,太麻烦了,我们可以使用一个工具。如下:

50mWCG.png

可以使用restclient-ui-3.5-jar-with-dependencies.jar测试接口。

点击编辑按钮,填写表单提交的content-type:application/x-www-form-urlencoded

50mdxn.png

点击插入参数按钮,填写参数后,点击生成。

50mMvQ.png

点击提交按钮,测试开始。

1.3、用户登录接口开发

1.3.1、功能分析

50mGzE.png

请求的url:/user/login

请求的方法:POST

参数:username、password,表单提交的数据。可以使用方法的形参接收。

返回值:json数据,使用TaotaoResult包含一个token。

业务逻辑:

登录的业务流程:

50mOk2.png

登录的处理流程:

1、登录页面提交用户名密码。

2、登录成功后生成token。token相当于原来的jsonid,字符串,可以使用uuid。

3、把用户信息保存到redis。key就是token,value就是TbUser对象转换成的json字符串。

4、使用String类型保存session信息。可以使用“前缀:token”为key。

5、设

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值