精华内容
下载资源
问答
  • csdn退出登录
    热门讨论
    2022-04-12 14:36:51

    鉴于csdn社区环境恶化,本人不再csdn更新文章,我活跃在B站给大家提供更多技术分享,问题与文章的阅览请移步Google与StackOverflow等优质社区。

    更多相关内容
  • 实现退出登录

    千次阅读 2022-06-30 14:25:33
    实现退出登录

    实现后台管理退出登录功能

    退出登录共分为两种情况:

    1. 主动退出
    2. 被动退出

    主动退出:

    手动点击退出,退出登录

    	// 退出登录  这里我是根据vuex的运行机制实现的登录以及退出功能
        async loginOut({ commit }) {
          try {
            commit('setToken', '')
            commit('setUserInfo', {})
            removeItem('token')
            removeItem('userInfo')
          } catch (err) {
            console.log(err)
          }
        }
    

    被动退出:

    token的时效性,也就是token过期,又或者是别人用你的账号登录在另一台设备给你顶下去,分为这两种情况。

    但是不管是哪种情况呢,都会执行这三个步骤:

    1、清除vuex中token以及用户信息
    2、清除本地的tokeny以及用户信息
    3、跳转至login页

    一、token时效性

     // 1、token失效:后端返回code === 1
        if (
          error.response &&
          error.reponse.data &&
          error.response.data.code === 401
        ) {
          store.dispatch('user/loginOut')
          router.push('/login')
        }
    

    二、单个用户(另一台设备登录)

     // 1、单个用户的话我们需要根据后台返回的字段进行判断
        if (
          error.response &&
          error.reponse.data &&
          error.response.data.code === 401
        ) {
          store.dispatch('user/loginOut')
          router.push('/login')
        }
    
    展开全文
  • 登录和退出登录

    千次阅读 2022-01-31 10:13:47
    1. 登录 1.1 接口说明 接口url:/login 请求方式:POST 请求参数: 参数名称 参数类型 说明 account string 账号 password string 密码 返回数据: { "success": true, "code": 200, "msg": ...

    1. 登录

    1.1 接口说明

    接口url:/login

    请求方式:POST

    请求参数:

    参数名称参数类型说明
    accountstring账号
    passwordstring密码

    返回数据:

    {
        "success": true,
        "code": 200,
        "msg": "success",
        "data": "token"
    }
    

    1.2 JWT

    登录使用JWT技术。

    jwt 可以生成 一个加密的token,做为用户登录的令牌,当用户登录成功之后,发放给客户端。

    请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。

    jwt 有三部分组成:A.B.C

    A:Header,{“type”:“JWT”,“alg”:“HS256”} 固定

    B:playload,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息

    C: 签证,A和B加上秘钥 加密而成,只要秘钥不丢失,可以认为是安全的。

    jwt 验证,主要就是验证C部分 是否合法。

    依赖包:

      <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    

    工具类:

    package com.mszlu.blog.utils;
    
    import io.jsonwebtoken.Jwt;
    import io.jsonwebtoken.JwtBuilder;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    public class JWTUtils {
    
        private static final String jwtToken = "123456Mszlu!@#$$";
    
        public static String createToken(Long userId){
            Map<String,Object> claims = new HashMap<>();
            claims.put("userId",userId);
            JwtBuilder jwtBuilder = Jwts.builder()
                    .signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
                    .setClaims(claims) // body数据,要唯一,自行设置
                    .setIssuedAt(new Date()) // 设置签发时间
                    .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
            String token = jwtBuilder.compact();
            return token;
        }
    
        public static Map<String, Object> checkToken(String token){
            try {
                Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
                return (Map<String, Object>) parse.getBody();
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
    
        }
    
    }
    
    

    1.3 Controller

    package com.mszlu.blog.controller;
    
    import com.mszlu.blog.service.LoginService;
    import com.mszlu.blog.vo.Result;
    import com.mszlu.blog.vo.params.LoginParam;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("login")
    public class LoginController {
    
        @Autowired
        private LoginService loginService;
    
        @PostMapping
        public Result login(@RequestBody LoginParam loginParam){
    
            return loginService.login(loginParam);
        }
    }
    
    

    1.4 Service

    package com.mszlu.blog.service;
    
    import com.mszlu.blog.vo.Result;
    import com.mszlu.blog.vo.params.LoginParam;
    
    public interface LoginService {
        /**
         * 登录
         * @param loginParam
         * @return
         */
        Result login(LoginParam loginParam);
    }
    
    

    md5加密的依赖包:

      <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
    
    package com.mszlu.blog.service.impl;
    
    import com.alibaba.fastjson.JSON;
    import com.mszlu.blog.dao.pojo.SysUser;
    import com.mszlu.blog.service.LoginService;
    import com.mszlu.blog.service.SysUserService;
    import com.mszlu.blog.utils.JWTUtils;
    import com.mszlu.blog.vo.ErrorCode;
    import com.mszlu.blog.vo.Result;
    import com.mszlu.blog.vo.params.LoginParam;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class LoginServiceImpl implements LoginService {
    
        private static final String slat = "mszlu!@#";
        @Autowired
        private SysUserService sysUserService;
    
        @Autowired
        private RedisTemplate<String, String> redisTemplate;
    
        @Override
        public Result login(LoginParam loginParam) {
            String account = loginParam.getAccount();
            String password = loginParam.getPassword();
            if (StringUtils.isBlank(account) || StringUtils.isBlank(password)){
                return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
            }
            String pwd = DigestUtils.md5Hex(password + slat);
            SysUser sysUser = sysUserService.findUser(account,pwd);
            if (sysUser == null){
                return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(),ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
            }
            //登录成功,使用JWT生成token,返回token和redis中
            String token = JWTUtils.createToken(sysUser.getId());
            redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(sysUser),1, TimeUnit.DAYS);
            return Result.success(token);
        }
    
        public static void main(String[] args) {
            System.out.println(DigestUtils.md5Hex("admin"+slat));
        }
    }
    
    
       @Override
        public SysUser findUser(String account, String pwd) {
            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SysUser::getAccount,account);
            queryWrapper.eq(SysUser::getPassword,pwd);
            queryWrapper.select(SysUser::getId,SysUser::getAccount,SysUser::getAvatar,SysUser::getNickname);
            queryWrapper.last("limit 1");
            SysUser sysUser = sysUserMapper.selectOne(queryWrapper);
            return sysUser;
        }
    
        SysUser findUser(String account, String pwd);
    

    1.5 登录参数,redis配置,统一错误码

    package com.mszlu.blog.vo.params;
    
    import lombok.Data;
    
    @Data
    public class LoginParam {
    
        private String account;
    
        private String password;
    }
    
    
    spring.redis.host=localhost
    spring.redis.port=6379
    
    package com.mszlu.blog.vo;
    
    public enum  ErrorCode {
    
        PARAMS_ERROR(10001,"参数有误"),
        ACCOUNT_PWD_NOT_EXIST(10002,"用户名或密码不存在"),
        NO_PERMISSION(70001,"无访问权限"),
        SESSION_TIME_OUT(90001,"会话超时"),
        NO_LOGIN(90002,"未登录"),;
    
        private int code;
        private String msg;
    
        ErrorCode(int code, String msg){
            this.code = code;
            this.msg = msg;
        }
    
        public int getCode() {
            return code;
        }
    
        public void setCode(int code) {
            this.code = code;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
    
    

    1.6 测试

    使用postman测试,因为登录后,需要跳转页面,进行token认证,有接口未写,前端会出现问题。

    token前端获取到之后,会存储在 storage中 h5 ,本地存储
    在这里插入图片描述

    在这里插入图片描述

    2. 获取用户信息

    2.1 接口说明

    接口url:/users/currentUser

    请求方式:GET

    请求参数:

    参数名称参数类型说明
    Authorizationstring头部信息(TOKEN)

    返回数据:

    {
        "success": true,
        "code": 200,
        "msg": "success",
        "data": {
            "id":1,
            "account":"1",
            "nickaname":"1",
            "avatar":"ss"
        }
    }
    

    2.2 Controller

    package com.mszlu.blog.controller;
    
    import com.mszlu.blog.service.SysUserService;
    import com.mszlu.blog.vo.Result;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("users")
    public class UserController {
    
        @Autowired
        private SysUserService sysUserService;
    
        @GetMapping("currentUser")
        public Result currentUser(@RequestHeader("Authorization") String token){
    
            return sysUserService.getUserInfoByToken(token);
        }
    }
    
    

    2.3 Service

     Result getUserInfoByToken(String token);
    
     	
    @Override
        public Result getUserInfoByToken(String token) {
            Map<String, Object> map = JWTUtils.checkToken(token);
            if (map == null){
                return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
            }
            String userJson = redisTemplate.opsForValue().get("TOKEN_" + token);
            if (StringUtils.isBlank(userJson)){
                return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
            }
            SysUser sysUser = JSON.parseObject(userJson, SysUser.class);
            LoginUserVo loginUserVo = new LoginUserVo();
            loginUserVo.setAccount(sysUser.getAccount());
            loginUserVo.setAvatar(sysUser.getAvatar());
            loginUserVo.setId(sysUser.getId());
            loginUserVo.setNickname(sysUser.getNickname());
            return Result.success(loginUserVo);
        }
    

    2.4 LoginUserVo

    package com.mszlu.blog.vo;
    
    import lombok.Data;
    
    @Data
    public class LoginUserVo {
    
        private Long id;
    
        private String account;
    
        private String nickname;
    
        private String avatar;
    }
    
    

    2.5 测试

    3. 退出登录

    3.1 接口说明

    接口url:/logout

    请求方式:GET

    请求参数:

    参数名称参数类型说明
    Authorizationstring头部信息(TOKEN)

    返回数据:

    {
        "success": true,
        "code": 200,
        "msg": "success",
        "data": null
    }
    

    3.2 Controller

    package com.mszlu.blog.controller;
    
    import com.mszlu.blog.service.LoginService;
    import com.mszlu.blog.vo.Result;
    import com.mszlu.blog.vo.params.LoginParam;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("logout")
    public class LogoutController {
    
        @Autowired
        private LoginService loginService;
    
        @GetMapping
        public Result logout(@RequestHeader("Authorization") String token){
            return loginService.logout(token);
        }
    }
    
    

    3.3 Service

      @Override
        public Result logout(String token) {
            redisTemplate.delete("TOKEN_"+token);
            return Result.success(null);
        }
    

    3.4 测试

    展开全文
  • 在网页上改了篇博客,但是没有同步到手机客户端,所以我想是不是需要重新登录一下。请老师们多多指教
  • 退出登录的两种方法

    千次阅读 2019-09-02 15:39:44
    Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); tExit = new Timer(); tExit.schedule(new TimerTask() { @Override public void run() { isExit = false;//取消退出 }...

    方法一:

    
      private boolean isExit;
    
    	@Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                exitByDoubleClick();
            }
            return false;
        }
    
        private void exitByDoubleClick() {
            Timer tExit = null;
            if (!isExit) {
                isExit = true;
                Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
                tExit = new Timer();
                tExit.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        isExit = false;//取消退出
                    }
                }, 2000);// 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务
            } else {
                finish();
            }
    
        }
    
    
    

    方法二(推荐):

       private long mBackPressTime = 0;
        @Override
        public void onBackPressed() {
            long nowTime = System.currentTimeMillis();
            if(nowTime - mBackPressTime > 2000){
                ToastUtils.showShort("再按一次退出程序");
                mBackPressTime = nowTime;
            } else {
                finish();
                System.exit(0);
            }
        }
    
    展开全文
  • 页面登录和退出登录(session的移除)

    万次阅读 2019-03-08 10:40:53
    //登录 @RequestMapping("/login") public String login(HttpSession session,Emp emp){ Emp sessionemp=service.login(emp); if (sessionemp!=null){ System.out.print...
  • 如何退出CSDN
  • 微信小程序 登录与退出登录

    千次阅读 2021-02-02 13:57:04
    //判断用户的登录状态 this.globalData.loginPromise = getUserInfo().then(res => { if (res.data.code == 0) { this.globalData.isLogin = true; this.globalData.userInfo = res.data.data } else { //未登录 ...
  • csdn怎么退出,切换账号

    千次阅读 多人点赞 2016-03-11 12:13:53
    目测是在csdn的总主页,但是好麻烦!
  • jwt退出登录的解决方案

    万次阅读 2019-11-05 13:54:39
    jwt退出登录 前言 JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。 { "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" } 以后,用户与服务端通信的时候...
  • linux配置超时_自动退出登录TMOUT

    千次阅读 2021-07-07 17:29:24
    linux配置超时_自动退出登录TMOUT介绍取消系统空闲等待时间设置系统空闲等待时间 介绍 系统为CentOS 7,一次无意操作在 /etc/profile 末尾增加了TMOUT=90,然后系统就总是一会没操作就自动退出登录,不仅ssh自动...
  • 股权投资退出机制.zip

    2021-12-11 12:37:28
    股权投资退出机制.zip,股权投资退出机制.doc
  • 1.csdn-markdown编辑器如何退出全屏预览模式 2.csdn-markdown编辑器如何不显示预览页 这设计得真让人难找。
  • shiro 实现退出登录功能

    万次阅读 2019-03-19 17:20:30
    shiro 实现退出登录功能 第一种方式: 1、配置权限控制,/logout.action=logout 2、在页面相应的退出操作中配置链接:/logout.action 即可,并不需要实现controller层 第二种方式(自定义退出登录功能) 1.shiro有许多...
  • Secure Shell (SSH) 远程登录退出

    千次阅读 2018-06-02 11:32:35
    Secure Shell (SSH) 远程登录退出
  • 怎么实现用户退出功能,退出后按浏览器后退按钮,返回的是用户登录界面我登录功能是用strut1+spring做的,用户名密码用户名和密码都是直接用form属性传递的,很容易就实现登录功能了,现在我想实现,用户退出功能,...
  • JWT 的退出登录方法

    千次阅读 2020-10-29 00:14:29
    凡是退出登录的token都放入黑名单中,定期清理。 每次用户请求服务器都校验token是否在黑名单 版本号校验 访问时从token中取出版本号和用户id 和 redis中存储 用户id和版本号 做对比,不一致则不给访问。 用户登出的...
  • 打开登录窗体,输入用户名、密码成功后打开主窗体。 用户名Admin,密码nopassword. 参考http://blog.csdn.net/Knight94/archive/2006/04/06/652394.aspx 的文章实现。
  • 微信小程序清除缓存/退出登录

    千次阅读 2021-11-10 09:03:57
    退出登录</button> </view> 小程序js页面 //清除缓存 clear:function(){ wx.clearStorageSync();//清除缓存 wx.showToast({ title: '退出登录成功', icon: 'none', duration: 2000, .
  • 带关闭按钮的登录表单模板是一款简单实用的会员登录前台页面模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
  • 登录功能的实现可以参考我上一篇博客:https://blog.csdn.net/weixin_44916185/article/details/105109391 如果登录成功,则将用户名传进主窗体,并将登录窗体的DialogResult结果设置为OK; if (result == 1) { ...
  • PHP实现退出登录功能

    千次阅读 2020-02-09 10:25:16
    在PHP程序中,登录完成之后将存入session中,退出登录时,需要释放session,相应的代码如下所示。 <?php session_start(); if(isset($_SESSION["uid"])) // 检测变量是否设置 { session_unset(); // 释放当前在...
  • 我们还是基于上一篇文章进行编写:https://blog.csdn.net/weixin_42629433/article/details/83352015 一. 配置文件 在 spring-security.xml 配置文件中配置有如下退出申明 : invalidate-session : 是否销毁 ...
  • 最近在进行oracle官方培训,想着有什么新的东西找个...最后选出2个最合适做技术博客的 一个是博客园一个就是CSDN 一开始觉的CSDN编辑器挺方便 但是今天彻底对CSDN失望: 下面列出详细原因 希望CSDN能有所悔改:...
  • CSDN产品周报第31期|PC端开放账号注销功能

    万次阅读 多人点赞 2022-03-23 12:23:57
    为了避免被盗号或非本人操作所带来的损失,请您在申请注销CSDN账号之前,充分阅读以下注意事项: 一、账号注销前提 1、账号处于正常使用状态,未发生被封号等异常情况; 2、账号已绑定手机号; 3、账号内个人...
  • ssm 实现登录退出

    千次阅读 2019-03-25 10:58:56
    JSP: <div class="container"> <form id="loginForm" action="doLogin" method="post" role="form"> <...用户登录</h2> <input type="text" id="loginacct" name="...
  • 退出登录如何实现?![图片说明](https://img-ask.csdn.net/upload/201604/12/1460463581_793199.jpg)
  • jwt退出登录/修改密码时如何使原来的token失效

    万次阅读 热门讨论 2019-11-20 20:08:45
    不行,这样即使退出登录后拿着以前的token还是可以访问到。 看了半天,感觉网上没有好的解决方案。真让人头大。如何Logout呢? 既然接口有这个要求,必须实现啊。绞尽脑汁,写一下可行的两种方法,虽然还是挺蠢的。 ...
  • spring-security退出登陆

    千次阅读 2019-09-22 11:20:38
    重定向到登录界面 2 自定义退出登陆的一些处理逻辑 在配置文件里自定义退出登陆的一些处理逻辑 . and ( ) //退出登陆相关的逻辑 . logout ( ) //自定义退出的url---默认的为/logout . logoutUrl...
  • 那么主要是做两个工作,一个是cas服务端配置application.properties文件...在子系统退出登录的时候,在请求cas的logout后面拼接一个要登录的系统地址比如: http://localhost:8080/cas/logout?service=http://localhos

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,538
精华内容 99,415
关键字:

csdn退出登录