第3节-如何实现登录/退出功能?
本节介绍怎么开发一个登录相关的接口。
- 登录
- 获取登录的session信息
- 退出
1. 引入微服务依赖
引入微服务登录辅助工具,提供包含保存、获取、删除session的操作。
<dependency>
<groupId>com.wueasy</groupId>
<artifactId>wueasy-cloud-web-login</artifactId>
<version>最新版本号</version>
</dependency>
2. 编写接口Controller
写一个登录的Controller
LoginController
/**
* 登录
*
* @author: fallsea
* @version 1.0
*/
@RestController
public class LoginController {
}
2.1 引用服务
登录辅助工具类提供一个服务类
LoginSessionService
,引用后,就可以对session进行操作。
@Autowired
private LoginSessionService loginSessionService;
提供方法
/**
* 登录session服务
* @author: fallsea
* @version 1.0
*/
public interface LoginSessionService {
/**
* 保存session
* @author: fallsea
* @param session
* @return token值
*/
String save(Session<?> session);
/**
* 删除session
* @author: fallsea
* @param token
* @return true删除成功
*/
boolean delete(String token);
/**
* 获取session
* @author: fallsea
* @param token
* @param typeReference
* @return
*/
Session<?> get(String token,TypeReference<?> typeReference);
/**
* 获取用户token列表
* @author: fallsea
* @param userId
* @return
*/
Set<String> getTokenListByUserId(String userId);
}
2.2 编写登录接口
写一个登录接口,传入用户名和密码,接口内验证用户名和密码是否匹配。如果验证通过后,需要组装用户
session
信息,最后把session
信息保存到redis
中,通过loginSessionService.save
保存session
信息。
/**
* 登录
* @author: fallsea
* @param dto
* @return
*/
@RequestMapping(value = "/login", method = { RequestMethod.POST }, produces = MediaType.APPLICATION_JSON_VALUE)
public Result<String> login(@RequestBody @Valid LoginDto dto) {
if (!"admin".equals(dto.getAccountNo()) || !"123456".equals(dto.getPassword())) {
throw new InvokeException(-1, "用户名或密码不正确");
}
// 登录,创建一个session,并返回用户信息,权限信息
Session<String> session = new Session<>();
User user = new User();
user.setIsSystem(true);// 是否超级管理员(1.是)
user.setUserId("1");
user.setUsername("wueasy");
session.setUser(user);
// 菜单权限
List<Menu> menuList = new ArrayList<>();
session.setMenuList(menuList);
// 可访问的url地址权限,用户有权限的url地址集合
Set<String> linkUrlSetAll = new HashSet<String>();
session.setAuthorizeUrlList(linkUrlSetAll);
// 拓展信息对象
session.setExtendedObject("1234");
//保存session信息
String token = loginSessionService.save(session);
return new Result<String>().setData(token);
}
/**
* 登录dto
* @author: fallsea
* @version 1.0
*/
@Data
public class LoginDto {
/**
* 用户名
*/
@NotBlank(message = "用户名不能为空!")
private String accountNo;
/**
* 密码
*/
@NotBlank(message = "密码不能为空!")
private String password;
}
2.3 编写获取用户信息接口
写一个获取用户
session
信息接口,传入token
信息获取用户session
,通过loginSessionService.get
获取session
信息。
/**
* 获取session信息
* @author: fallsea
* @param request
* @return
*/
@RequestMapping(value= "/getSessionInfo",method={RequestMethod.POST},produces = MediaType.APPLICATION_JSON_VALUE)
public Result<User> getSessionInfo(HttpServletRequest request)
{
String token = request.getHeader("token");
if(StringHelper.isNotBlank(token)) {
Session<String> session = (Session<String>) loginSessionService.get(token, new TypeReference<Session<String>>() {});
if(null!=session) {
return new Result<User>().setData(session.getUser());
}
}
return new Result<User>();
}
2.4 编写退出接口
写一个用户退出接口,传入
token
信息删除用户session
,通过loginSessionService.delete
删除session
信息。
/**
* 退出
* @author: fallsea
* @param request
* @return
*/
@RequestMapping(value= "/logout",method={RequestMethod.POST},produces = MediaType.APPLICATION_JSON_VALUE)
public Result<Void> logout(HttpServletRequest request)
{
String token = request.getHeader("token");
if(StringHelper.isNotBlank(token)) {
loginSessionService.delete(token);
}
return new Result<Void>();
}
2.5 修改session过期时间
通过修改配置信息
wueasy.gateway.session.expire
设置用户session过期的时间。如设置1h
1小时过期
wueasy :
gateway:
session:
expire: 1h #过期时间
2.6 修改redis配置
用户
session
保存在redis中,需要设置redis的连接信息。
wueasy :
data:
redis: #redis配置
session: #session连接配置
database : 1 #数据库索引(默认为0)
host : 127.0.0.1 #服务器地址
port : 6379 #服务器连接端口
password : 123456 #服务器连接密码(默认为空)
pool : #连接池配置
maxIdle : 8 # 连接池中的最大空闲连接,默认值也是8。
minIdle : 0 #连接池中的最小空闲连接,默认值也是0。
maxTotal : 2000 # 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
maxWaitMillis : 1000 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
timeout : 3000 #连接超时时间(毫秒)
3. 启动服务
分别启动 注册中心、微服务、网关
4. 测试接口
4.1 登录接口
- 接口地址:
http://127.0.0.1:8088/demo/login
- 请求类型:
POST
- 请求参数:
{ "accountNo":"admin", "password":"123456" }
- 成功示例:
{ "errorNo": 0, "data": "bearer:1:35c8538dcfefab00d574cf2a48e93f96" }
4.2 获取session信息
- 接口地址:
http://127.0.0.1:8088/demo/getSessionInfo
- 请求类型:
POST
- 请求参数:通过
hedaer
方式传入参数token
,值为bearer:1:35c8538dcfefab00d574cf2a48e93f96
- 成功示例:
{ "errorNo": 0, "data": { "userId": "1", "username": "wueasy", "isSystem": true } }
4.3 退出
- 接口地址:
http://127.0.0.1:8088/demo/logout
- 请求类型:
POST
- 请求参数:通过
hedaer
方式传入参数token
,值为bearer:1:35c8538dcfefab00d574cf2a48e93f96
- 成功示例:
{ "errorNo": 0 }