用户注册&单点登录
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是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...
随机推荐
- Tomcat日志监控工具——Probe
今天遇到项目运行过程中需要查看用户访问日志,log4j.properties配置好,将log日志输出到tomcat的log文件夹下,但不可能每次都去服务器上拉取log文件查看,网上找了下,发现一个日志 ...
- idea中Lombok的Buider构造器模式,getter/setter正确使用方法
public class ApiUser implements Serializable { private Long id; /*** * 用户类型:single,org(organization) ...
- 第二十二章 集成验证码——《跟我学Shiro》
目录贴:跟我学Shiro目录贴 在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码/恶意评论等.目前也有一些验证码比较简单,通过一 ...
- iOS-UIImageView和UIImage
UIImage self.imageView.contentMode = UIViewContentModeCenter;// 图片的内容模式 [self.imageView setFrame:CGR ...
- ES SQL使用说明文档
ES SQL使用说明文档 一.Elasticsearch术语介绍 l 接近实时(NRT): Elasticsearch 是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一 ...
- talking data 集成
talking data 集成需要手动添加libz.td
- Oracle数据同步交换
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路. TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...
- Ubuntu16.04下KeepAlived+Nginx 布署
前言 网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办 ...
- vue等单页面应用及其优缺点
优点: Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统.MVVM.数据驱动.组件化.轻量.简洁.高效.快速.模块友好. 缺点: 不支持低版本 ...
- 【VS开发】【数据库开发】libevent简单入门和介绍
libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库,今天学习下. 总体来说,libevent有下面一些特点和优势: * 统一数据源, 统一I/O事件,信号和定 ...