淘东电商项目(27) -门户登出功能

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 淘东电商项目(27) -门户登出功能

引言

本文代码已提交至Github(版本号:42c2ed4af58dac7388e399a1f3606baf4c57744e),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

在前面的两篇博客,实现了「注册」和「登录」的功能:

本文主要讲解“登出功能”,虽然功能看上去比较简单,但是遇到了不少的坑。

本文目录结构:

l____引言

l____ 1. 功能演示及实现思路

l____ 2. 登出功能

l________ 2.1 前端代码

l________ 2.2 后端代码

l____ 3. 遇到的坑

l________ 3.1 JQ ajax请求后台不能“请求转发”或者“重定向”

l________ 3.2 JQ ajax 返回格式的指定格式

l____总结

1. 功能演示及实现思路

实现思路:

  1. 会员登录成功后,点击主页面右上角的退出,请求后台
  2. 后台删除Cookie信息里面的token
  3. 后台根据token删除Redis里保存的token
  4. 后台根据token更新数据库里面对应的token记录

功能演示:

1.首先登录,登录成功后,界面如下:

2.登录成功后,可以看到Redis和数据库均有内容:

redis 数据库

3.点击右上角的退出,点击完后,可以看到自动跳转到主页面:

点击前 点击后

4.同时Redis和数据库里的内容均有改变:

Redis 数据库

2. 登出功能

2.1 前端代码

前端我使用的是jq的ajax请求,使用的是RESTful标准请求(如果对RESTful不清楚,可以参考我的博客:《RESTful Web 服务四种操作POST/DELETE/PUT/GET》),代码如下:

html代码:

<a href="javascript:void(0);" onclick="logout();">退出</a>

js代码:

<!--引入JQuery-->
    <script src="../res/static/js/jquery.min.js"></script>
    <script type="text/javascript">
        function logout() {
            $.ajax({
                type: "delete",
                url: "exit",
                contentType: "application/json",
                dataType: "json",
                success: function (result) {
                    window.location.href = "/";
                },
                error: function (result) {
                }
            });
        }
    </script>

2.2 后端代码

控制层(使用的是Feign远程调用):

@Controller
public class LogoutController extends BaseWebController {
    @Autowired
    private MemberLogoutServiceFeign memberLogoutServiceFeign;
    @DeleteMapping("/exit")
    @ResponseBody
    public BaseResponse<JSONObject> exit(HttpServletRequest request, HttpServletResponse response, Model model) {
        // 1.从cookie 中 获取 会员token
        String token = CookieUtils.getCookieValue(request, WebConstants.LOGIN_TOKEN_COOKIENAME, true);
        CookieUtils.deleteCookie(request, response, WebConstants.LOGIN_TOKEN_COOKIENAME);
        if (!StringUtils.isEmpty(token)) {
            // 2.调用登出服务接口
            return memberLogoutServiceFeign.logout(token);
        }
        return null;
    }
}

会员服务里面的登出接口实现(使用的是Redis与数据库的事务同步工具类,不懂的可以下载代码看,前面的文章已讲过):

@RestController
public class MemberLogOutServiceImpl extends BaseApiService<JSONObject> implements MemberLogOutService {
    @Autowired
    private GenerateToken generateToken;
    @Autowired
    private UserTokenMapper userTokenMapper;
    /**
     * 手动事务工具类
     */
    @Autowired
    private RedisDataSoureceTransaction manualTransaction;
    @Override
    public BaseResponse<JSONObject> logout(String token) {
        TransactionStatus transactionStatus = null;
        try {
            transactionStatus = manualTransaction.begin();
            //2.删除Redis
            generateToken.removeToken(token);
            //1.首先更新数据库
            int updateTokenAvailability = userTokenMapper.updateTokenAvailability(token);
            if (updateTokenAvailability < 0) {
                manualTransaction.rollback(transactionStatus);
                return setResultError("系统错误");
            }
            manualTransaction.commit(transactionStatus);
            JSONObject data = new JSONObject();
            data.put("result", true);
            return setResultSuccess(data);
        } catch (Exception e) {
            try {
                // 回滚事务
                manualTransaction.rollback(transactionStatus);
            } catch (Exception e1) {
            }
            return setResultError("系统错误!");
        }
    }
}

3. 遇到的坑

3.1 JQ ajax请求后台不能“请求转发”或者“重定向”

调用后台登出接口的时候,如果直接返回redirect:/,前端页面是不会直接跳转到的,这是为什么呢?

因为JQ使用ajax是禁止后台执行“请求转发”或者“重定向”的,只能后台返回数据,由前端使用window.location.href执行页面的跳转。如下代码:

$.ajax({
         type: "delete",
         url: "exit",
         contentType: "application/json",
         dataType: "json",
         success: function (result) {
             window.location.href = "/";
         },
         error: function (result) {
         }
     });
 }
);

3.2 JQ ajax 返回格式的指定格式

在上面代码,可以看到,ajax指定返回的格式为json,因此别忘记了在接口处添加@ResponseBody注解:

总结

本文主要讲解了 「登出」 的功能,虽然流程不复杂,但是里面涉及到了很多的基础知识,如RESTfulJQ ajax请求注意细节等。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
SQL 安全 前端开发
OA项目之用户登录&首页展示(一)
OA项目之用户登录&首页展示
|
6月前
|
前端开发 JavaScript Java
淘东电商项目(24) -获取验证码功能
淘东电商项目(24) -获取验证码功能
37 0
|
6月前
|
前端开发 NoSQL 数据库
淘东电商项目(26) -门户登录功能
淘东电商项目(26) -门户登录功能
24 0
|
6月前
|
前端开发 NoSQL 数据库
淘东电商项目(25) -门户注册功能
淘东电商项目(25) -门户注册功能
22 0
|
6月前
|
canal Java 微服务
淘东电商项目(23) -门户界面
淘东电商项目(23) -门户界面
29 0
|
6月前
|
关系型数据库 MySQL 数据库
淘东电商项目(16) -会员注册功能
淘东电商项目(16) -会员注册功能
44 0
|
6月前
|
NoSQL 数据库 Redis
淘东电商项目(20) -会员唯一登录
淘东电商项目(20) -会员唯一登录
41 0
|
6月前
|
移动开发 NoSQL Redis
淘东电商项目(35) -SSO单点登录(登录功能完善)
淘东电商项目(35) -SSO单点登录(登录功能完善)
47 0
|
6月前
|
NoSQL 前端开发 数据库
淘东电商项目(36) -SSO单点登录(退出功能)
淘东电商项目(36) -SSO单点登录(退出功能)
31 0
|
6月前
|
设计模式 Java Maven
淘东电商项目(60) -聚合支付(集成支付宝)
淘东电商项目(60) -聚合支付(集成支付宝)
44 0