第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
    }
    
Copyright © wueasy.com 2017-2022 all right reserved,powered by Gitbook未经允许,禁止以任何形式传播 修订时间: 2022-09-04

results matching ""

    No results matching ""