您当前的位置: 首页 > 

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

杨林伟 发布时间:2020-03-11 15:29:55 ,浏览量:3

引言

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

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

  • 《淘东电商项目(25) -门户注册功能》
  • 《淘东电商项目(26) -门户登录功能》

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

本文目录结构: 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代码:

 退出

js代码:

 
    
    

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

    
2.2 后端代码

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

@Controller
public class LogoutController extends BaseWebController {

    @Autowired
    private MemberLogoutServiceFeign memberLogoutServiceFeign;


    @DeleteMapping("/exit")
    @ResponseBody
    public BaseResponse 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 implements MemberLogOutService {

    @Autowired
    private GenerateToken generateToken;

    @Autowired
    private UserTokenMapper userTokenMapper;

    /**
     * 手动事务工具类
     */
    @Autowired
    private RedisDataSoureceTransaction manualTransaction;

    @Override
    public BaseResponse logout(String token) {
        TransactionStatus transactionStatus = null;
        try {
            transactionStatus = manualTransaction.begin();
            //2.删除Redis
            generateToken.removeToken(token);
            //1.首先更新数据库
            int updateTokenAvailability = userTokenMapper.updateTokenAvailability(token);
            if (updateTokenAvailability             
关注
打赏
1688896170
查看更多评论
0.1167s