用户注册&单点登录
package com.tttttt.portal.controller; import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.tttttt.manager.pojo.User;
import com.tttttt.portal.util.CookieUtils;
import com.tttttt.sso.service.UserService; @Controller
@RequestMapping("user")
public class UserController { @Autowired
private UserService userService; @Value("${TT_TICKET}")
private String TT_TICKET; // type : "POST",
// //url : "/service/user/doRegister",
// url : "/user/doRegister.html",
// data : {password:_password,username:_username,phone:_phone},
// dataType : 'json',
// if(result.status == "200")
/**
* 用户注册
*
* @param user
* @return
*/
@RequestMapping(value = "doRegister", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> doRegister(User user) {
// 调用sso服务注册用户
this.userService.saveUser(user); // 封装返回数据map
Map<String, Object> map = new HashMap<>();
map.put("status", "200"); return map;
} // type: "POST",
// url: "/service/user/doLogin?r=" + Math.random(),
// data: {username:_username,password:_password},
// dataType : "json",
// if (obj.status == 200)
/**
* 用户登录
*
* @param request
* @param response
* @param user
* @return
*/
@RequestMapping(value = "doLogin", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> doLogin(HttpServletRequest request, HttpServletResponse response, User user) {
// 声明返回的map
Map<String, Object> map = new HashMap<>(); // 调用单点登录服务,执行用户登录操作,返回ticket
String ticket = this.userService.doLogin(user); // 判断ticket是否为非空
if (StringUtils.isNotBlank(ticket)) {
// 如果为非空表示登录成功
// 把ticket放到cookie中
CookieUtils.setCookie(request, response, this.TT_TICKET, ticket, 60 * 60 * 24, true); // 封装返回数据
map.put("status", 200);
} // 如果为空,表示登录失败,什么都不做 // 返回结果
return map; } }
package com.tttttt.sso.service;
import com.tttttt.manager.pojo.User;
public interface UserService {
/**
* 检查数据是否可用
*
* @param param
* @param type
* @return
*/
Boolean check(String param, Integer type);
/**
* 根据Ticket查询用户
*
* @param ticket
* @return
*/
User queryUserByTicket(String ticket);
/**
* 用户注册
*
* @param user
*/
void saveUser(User user);
/**
* 用户登录
*
* @param user
* @return
*/
String doLogin(User user);
}
package com.tttttt.sso.service.impl; import java.io.IOException;
import java.util.Date; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tttttt.manager.mapper.UserMapper;
import com.tttttt.manager.pojo.User;
import com.tttttt.sso.redis.RedisUtils;
import com.tttttt.sso.service.UserService; @Service
public class UserServiceImpl implements UserService { private static final ObjectMapper MAPPER = new ObjectMapper(); @Autowired
private UserMapper userMapper; @Value("${tttttt_TICKET_KEY}")
private String tttttt_TICKET_KEY; @Autowired
private RedisUtils redisUtils; @Override
public Boolean check(String param, Integer type) {
// 声明查询条件
User user = new User(); // 1、2、3分别代表username、phone、email
switch (type) {
case 1:
user.setUsername(param);
break;
case 2:
user.setPhone(param);
break;
case 3:
user.setEmail(param);
break; default:
break;
} // 根据条件查询
int count = this.userMapper.selectCount(user); // 如果查询结果count为0表示没有人用过,所以返回true,表示可用
// 如果查询结果count不为0表示有人用过,所以返回false,表示不可用
return count == 0;
} @Override
public User queryUserByTicket(String ticket) {
// 从redis中查询用户的登录信息,是一个json格式的数据
// 需要给redis中的key增加前缀,便于redis数据的维护和管理
String json = this.redisUtils.get(this.tttttt_TICKET_KEY + ticket); // 判断json不为空
if (StringUtils.isNotBlank(json)) {
try {
// 把json格式的数据转为User对象
User user = MAPPER.readValue(json, User.class); // 如果用户请求这个方法,表示用户是活动的,所以需要重置有效时间
this.redisUtils.expire(this.tttttt_TICKET_KEY + ticket, 60 * 60); // 返回user结果
return user;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 如果查询结果为空,或者有异常,返回null
return null;
} @Override
public void saveUser(User user) {
// 设置用户的数据
user.setCreated(new Date());
user.setUpdated(user.getCreated()); // 对用户密码进行md5加密
user.setPassword(DigestUtils.md5Hex(user.getPassword())); // 保存用户数据到MySQL
this.userMapper.insert(user); } @Override
public String doLogin(User user) {
// 根据条件从MySQL中查询用户
user.setPassword(DigestUtils.md5Hex(user.getPassword()));
User result = this.userMapper.selectOne(user); // 如果查到的结果不为空,表示用户登录成功
if (result != null) {
// 生成唯一的数,就是ticket
// 利用redis单线程的特点,使用incr每次加一,获取唯一数
// ticket就是redis的唯一数+用户id
String ticket = "" + this.redisUtils.incr("tttttt_TICKET_INCR") + result.getId(); try {
// 把ticket和用户的数据(json数据)放到redis中
this.redisUtils.set(this.tttttt_TICKET_KEY + ticket, MAPPER.writeValueAsString(result), 60 * 60); // 返回ticket
return ticket;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } // 如果查询结果为空或者有异常,返回空
return null;
} }
登录的问题:
1.没有欢迎用户的语句
2.cookie中没有ticket的信息
#配置Nginx反向代理的时候携带域名
proxy_set_header Host $host;
用户注册&单点登录的更多相关文章
- 看图理解JWT如何用于单点登录
单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...
- 不需要客户端插件PHP也能实现单点登录
分析CAS原理,构建PHP单点登录 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户 只需要登录一次就 ...
- Shiro与CAS整合实现单点登录
1.简介 CAS:Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法. Shiro:Apache Shiro是一个Java安全框架,可以帮助我们完成认证.授权.会话管 ...
- SpringBoot集成CAS单点登录,SSO单点登录,CAS单点登录(视频资料分享篇)
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很早期的公司 ...
- 开发SSO单点登录需要注意的问题
一.单点登录系统开发需要注意的问题 1.单点登录系统需要支持jsonp请求? 单点登录系统主要是向其他系统提供用户身份验证服务,因此需要提供对外接口,而外部系统通过接口访问时,必然涉 ...
- 029.[转] SSO单点登录的通用架构实现
单点登录的通用架构实现 pphh发布于2018年4月26日 http://www.hyhblog.cn/2018/04/26/single_sign_on_arch/ 目录 1. 什么是单点登录 2. ...
- 单点登录之CAS原理和实现(转载)
转载源:https://www.jianshu.com/p/613c615b7ef1 单点登录之CAS原理和实现 来源于作者刘欣的<码农翻身> + 自己的备注理解 这家集团公司财大气粗,竟 ...
- JWT--无状态单点登录
序言 传统的 seesion 认证存在的问题: 1)用户信息存储在内存中,用户规模大之后增加服务器开销:2)由于登录信息存储在内存中,限制了登录机器,不利于分布式站点. JWT JWT无状态登录 常规 ...
- 著名ERP厂商的SSO单点登录解决方案介绍一
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...
随机推荐
- 流式数据处理在百度数据工厂的应用与实践 原创: 李俊卿 AI前线 今天
流式数据处理在百度数据工厂的应用与实践 原创: 李俊卿 AI前线 今天
- 用http请求thrift服务端出现了内存溢出的情况
记一次内存溢出的分析经历 - Janti - 博客园 https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出 ...
- linux内核中#if IS_ENABLED(CONFIG_XXX)与#ifdef CONFIG_XXX的区别
1. #if IS_ENABLED(CONFIG_XXX) 1.1 IS_ENABLED的定义如下: /* * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CON ...
- PorterDuffXfermode的模式取值
PorterDuffXfermode(Mode mode) PorterDuff.mode.XXX取值有: 1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上. 2.PorterD ...
- linux常用的命令和工具
screen 管理会话工具 与之相似的工具还有tmux # screen // 进入一个回话 .还可以给会话取名 screen -S modify_screen #vim screen.txt ...
- delphi ADOQUery中错误解决方法"无法为更新定位行。一些值可能已在最后...
使用delphi中的ADOQuery控件中自带的,insert ,edit,delete此操作时,有时会出现下面的错误提示,提示错误信息:"无法为更新定位行.一些值可能已在最后一次读取后已更 ...
- PostgreSQL学习笔记——窗口函数
在学习窗口函数之前,我们新建一个Product表并往其中插入一些数据: drop table if exists Product; create table Product ( product_id ...
- 【ARTS】01_35_左耳听风-201900708~201900714
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- iOS-KVO(转)
参考学习网址:http://blog.sina.com.cn/s/blog_71715bf8010166ut.html KVO就是NSKeyValueObserving的缩写,它也是Foundatio ...
- oracle jdk和openjdk区别;idea如何加载jdk源码并调试jdk代码
两个jdk的区别 oracle jdk是sun/oracle(甲骨文)公司的,部分jdk开源:相对比较稳定,使用的比较多. openjdk是完全开源的,据说是官方oracle唯一承认的开源版本. id ...