精华内容
下载资源
问答
  • iOS 利用token保持登陆状态

    千次阅读 2017-05-08 09:29:25
    而是登录时,登陆成功,从服务器接收tokentoken是服务器生成的一个字符串,唯一标识一个用户,并且会在一段时间后销毁,所以我们很久不登录APP,会要求重新登录利用一个工具类,进行token的存储、删除和读取。...

    项目里,需要在客户登陆后保持登陆状态。使用的不是存储用户名和密码,每次去模拟登陆。
    而是登录时,登陆成功,从服务器接收token,token是服务器生成的一个字符串,唯一标识一个用户,并且会在一段时间后销毁,所以我们很久不登录APP,会要求重新登录。

    利用一个工具类,进行token的存储、删除和读取。登陆成功进行存储、下一次打开APP进行读取、退出进行删除。

    如果,有refreshtoken,可以进行跟新,就不用再次登录。

    代码如下:

    
    #import "GCTokenManager.h"
    
    NSString *const TOKEN_KEY = @"token";
    
    
    @implementation GCTokenManager
    
    // 存储token
    +(void)saveToken:(GCToken *)token
    {
        NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];
        NSData *tokenData = [NSKeyedArchiver archivedDataWithRootObject:token];
        [userDefaults setObject:tokenData forKey:TOKEN_KEY];
        [userDefaults synchronize];
    }
    
    // 读取token
    +(GCToken *)getToken
    {
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        NSData *tokenData = [userDefaults objectForKey:TOKEN_KEY];
        GCToken *token = [NSKeyedUnarchiver unarchiveObjectWithData:tokenData];
        [userDefaults synchronize];
        return token;
    }
    
    // 清空token
    +(void)cleanToken
    {
        NSUserDefaults *UserLoginState = [NSUserDefaults standardUserDefaults];
        [UserLoginState removeObjectForKey:TOKEN_KEY];
        [UserLoginState synchronize];
    }
    
    
    // 跟新token
    +(GCToken *)refreshToken
    {
        return nil;
    }

    这里的GCToken 是服务器端返回的token的模型,要根据自己项目中返回的JSON自定义。

    展开全文
  • 利用token来验证用户的身份可以分为以下几步,之后再逐步分析。 1.用户在前端提交表单到后端 2.后端根据表单信息生成token返回给前端 3.前端将token取出,存储到localStorage以及vuex中 4.当用户再次发起请求时,...

    其实本篇博客的篇幅可能会比较长,所以会分两次来写。
    那么开始吧。

    利用token来验证用户的身份可以分为以下几步,之后再逐步分析。
    1.用户在前端提交表单到后端
    2.后端根据表单信息生成token返回给前端
    3.前端将token取出,存储到localStorage以及vuex中
    4.当用户再次发起请求时,使用axios拦截器在请求头加上token(后端需要在设置跨域的地方设置可接受跨域的字段)
    5.后端收到请求后取出请求头中的token与数据库中的token进行对比,如果一致则说明用户验证通过。(还未写完)
     

    第一步:用户在前端提交表单到后端。
    我们先来看前端的代码,

    当点击登录按钮时,会触发login函数,这里将数据发送到http://localhost:3000/auth/login,也就是后端的登录接口

     

    第二步:后端根据表单信息生成token返回给前端.
    这一步我们要进入node部分的代码了,我们看一下node对表单数据进行了什么处理。

    这部分写的比较粗暴,因为是边学边写的,所以暂时只注重功能上的实现。
    那么首先这里通过req.body获得了表单的用户密码,之后我们通过查询语句在数据库中查询对应的用户。这个地方使用了promise来控制数据库操作的一个同步,这是因为这个地方有两个跟数据库有关的操作,一个是查询是用户,一个是如果查找到了用户,还需要进行插入数据库的操作,那么为了保持这两个操作的先后顺序,这里就将插入的操作放在了then的回调中(下面会贴上代码。)
    对于查询到的数据,我通过JSON.parse(JSON.stringify(result))将查询的结果转为了数组,这是为了方便我们之后的操作,
    显然如果查询到了用户,那么数组长度肯定是大于0的,所以当user.length === 0时,说明用户可能输入有误,因此我们在响应的代码中reject({state: 1, message: '输入的用户名或密码有误'})。
    反过来说,现在假设查询到了用户,那么代码的逻辑就会跳到最第二个else,此时我们对查询到的用户信息利用jwt加密(jwt是jsonwebtoken,可以在项目中用npm下载),jwt.sign的第二个参数是加密用的密钥字符串,可以自行决定密钥。
    加密完成后,下一行代码的resolve{state, username, password, token}),表示要将这些数据发到then()的回调函数中,我们通过then中的回调函数将这些数据插入数据库


    这里的代码很简单,主要看到最后的else语句,这里除了将相应的信息和token插入数据库,后端还需要将token返回给前端,所以在res.send中写上token,以便前端能够接收到。

     

    第三步:前端将token取出,存储到localStorage以及vuex中
    由于我们发送的是axios请求,而aioxs请求是支持promise的api的,因此我们也可以在发送请求的后面加上then()来接收后端返回的数据。我们可以在控制台中将接收到的结果打印出来看一下。


    因此,我们就可以在then的回调中将接收到的数据分别存储到localStorage跟vuex中啦。
     

    第四步:当用户再次发起请求时,使用axios拦截器在请求头加上token(后端需要在设置跨域的地方设置可接受跨域的字段)
    由于已经登录过了,所以用户就有了token,那么当我们再次向后端发起请求的时候,就需要在headers中加上token。
    因为我们用的是aioxs发送请求,所以在发送请求之前,我们应该使用axios拦截器拦截请求,给headers加上tokon.
    需要注意的就是,我们应该将这段代码写在一个单独的文件,然后在main.js导入。
    那么我们看一下这段代码,config我们可以在上面的那张在控制台接收到的数据的图中看到,实际上就是一些配置信息。
    因此如果用户已经登录过了,那么此时vuex中的state中的token肯定是有值的,所以只要这个if判断成立,就会给这个headers加上一个字段Authorization,值为token,这样我们就在发送请求之前给headers加上token了。当然到了这一步还不行,我们还需要在后端设置跨域,

    我们还需要在这个允许接收的请求头上加上一个Authorization,这样我们才能够将数据发送过去,否则就会出现跨域的报错。

    展开全文
  • token (需要django的rest_framework.authtoken模块) 客户端通过post请求发送username和password到服务器端,服务器端验证用户名和密码正确后返回一个token 客户端接受返回的token并保存 客户端发起请求时需要在请求...

    token (需要django的rest_framework.authtoken模块)

    1. 客户端通过post请求发送username和password到服务器端,服务器端验证用户名和密码正确后返回一个token
    2. 客户端接受返回的token并保存
    3. 客户端发起请求时需要在请求的header中的authentication属性添加token值
    4. django使用request.user.is_authenticated()判断用户是否登录,若token正确则会自动登陆

    session(为每个浏览器创建一个session对象,每个session对象有一个Jsessionid,以cookie的方式将Jsessionid返回给浏览器):

    在这里插入图片描述

    1. 前端页面发送username和password到服务器的login接口时,针对每个用户的浏览器生成一个session对象,每个session对象有一个Jsessionid,login判断用户名和密码正确后,,通过request.session[‘username’]=username,request.session[‘isLogin’]=true往该用户浏览器的session中添加多个key/value值,数据库django-session表中为每个session对象生成一条记录[sessionid,key,value:“hduhueu”,“username”:“pengcong1995”;“isLogin”:“true”],并且将Jsessionid置于cookie中返回给前端(默认自动进行)
    2. 前端接收返回的结果自动保存Jsessionid在cookie中
    3. 前端浏览器发起请求时,请求里自动带上了cookie的数据包括Jsessionid
    4. 服务器端接收请求,通过Jsessionid找到对应的session对象,通过不同的session对象为不同的用户服务,使用username=request.session.get(‘username’)判断用户是否登录,若username存在,则为已登录过的用户,用户名已知,不存在则为未登录用户(使用request.session.get(‘username’)时,服务器自动读取cookie中的sessionid,找到对应的session,若不存在sessionid,则未登录没有session对象,再根据session对象找到对于的key即username,再获取该值,如果存在则已登陆过,否则未登陆)
    5. 退出登陆时,根据cookie中的sessionid找到对应的session对象,删除当前用户的session中的数据即可,del request.session[‘username’],全部删除,request.session.clear()

    使用django自带的登录模板:

    1. 登录user=authenticate(username,password),login(request,user)
    2. 查询当前用户 request.user,查询是否登陆:request.user.is_authenticated()
    3. 用户退出注销,logout(request)
    展开全文
  • 一,登录成功并获取token String token=UUID.randomUUID()+"";//设置token @PostMapping("/login") public Result login(@RequestBody User postUser) { System.out.println("someone's trying login..."); ...

    Token

    一,登录成功并获取token

    String token=UUID.randomUUID()+"";//设置token
    
    @PostMapping("/login")
    public Result login(@RequestBody User postUser) {
        System.out.println("someone's trying login...");
        Result result = new Result();
        //判断是否登录
        User user = userDao.getUserByLogin(postUser.getUsername(), postUser.getPassword());
        //如果登录成功,账号密码匹配,则
        if (user != null) {
            String token = UUID.randomUUID() + "";//申请一个token
            //key:token   value:user 写入redis
            redisTemplate.opsForValue().set(token, user, Duration.ofMinutes(60L));//保存一个小时的登录状态
            result.setToken(token);//token也返回前端
            result.setMsg("登录成功,一小时内可以免登录进入");
            result.setResult(true);
        } else {
            //登录失败
            result.setResult(false);
            result.setMsg("请登录后再尝试此页");
        }
        return result;
    }
    

    二,使用token获取登录用户

    ==》前端传递令牌token的时候将其放入header当中!

    后端:

    @GetMapping("/getUserOfLogin")
    public Result getUserOfLogin(HttpServletRequest request) {//前端在header中传递token验证是否已经登录
        String token = request.getHeader("token");//从请求头当中获取token
        //前往redis中查询
        Object user = redisTemplate.opsForValue().get(token);
        if(null!=user){
            return new Result(token, true, "已经登录");
        }else{
            return new Result(null, false, "用户未登录");
        }
    }
    

    前端:

    onSubmit() {
      this.$http({
        url:"http://localhost:8989/test/getUserOfLogin",
        method:"get",
        headers:{token:"6d01b3bf-7e8b-411d-9210-34886a618a16"}
      }).then(res=>{
        console.log(res.data.result);
        console.log(res.data.msg);
        console.log(res.data.token);
      })
    }
    

    三,token 的 filter 过滤器

    @WebFilter(filterName = "loginFilter", urlPatterns = {"/test/view/*", "/test/viewer/*"})
    public class LoginFliter implements Filter {
        @Resource
        private RedisTemplate redisTemplate;
    
        @Override
        public void init(FilterConfig filterConfig) {
            System.out.println("filter init...");
        }
    
        @Override
        public void destroy() {
            System.out.println("filter destroy...");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest,
                             ServletResponse servletResponse,
                             FilterChain filterChain) throws IOException, ServletException {
            //验证登录状态
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            //filter过滤器跨域处理
            String origin = request.getHeader("Origin");
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
            response.setHeader("Access-Control-Allow-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "accept,x-requested-with,Content-Type,token");
            response.setHeader("Access-Control-Allow-Credentials", "true");
    
            String token = request.getHeader("token");//从请求头当中获取token
            System.out.println("trying token:" + token);
            //防止token为null
            if (token == null) {
                System.out.println("Attention:token is null!!");
            }
            token = token == null ? "" : token;
    
            Long expire = redisTemplate.getExpire(token);//不存在返回-2,存在返回秒数
            System.out.println("token expire:" + expire);
    
            if (expire > 0) {//已经登录
                System.out.println("token: " + token + " pass...");
                //需要重置token的时间,说明正在操作
                redisTemplate.expire(token, Duration.ofMinutes(60L));//重置为一个小时
                filterChain.doFilter(request, response);//放行
            } else {//未登录
                System.out.println("token: " + token + " fail to pass...");
                ObjectMapper objectMapper = new ObjectMapper();
                String jsonResult = objectMapper.writeValueAsString(new Result(null, false, "请先登录"));
    
                response.setContentType("json/text;charset=utf-8");
                PrintWriter writer = response.getWriter();
                writer.write(jsonResult);
            }
    
        }
    }
    

    四,前端存储token

    前端利用localStorage来进行存储:

    localStorage.setItem("testkey","testvalue");//设置key 和 value
    console.log(localStorage.getItem("testkey"));//获取 key 和 value
    
    function deleteLocalStorage(key) {
      localStorage.removeItem(key);//删除 key
    }
    deleteLocalStorage("testkey");
    console.log("testkey: ",localStorage.getItem("testkey"));
    

    未完…

    展开全文
  • 首先用户在客户端进行登录,发送请求给服务端,服务端验证用户和密码是否正确,完全一致后,服务端会生成一个当前用户所对应的一个token值,并在响应中将其返回给客户端。 2、客户端将该token值进行存储 3、携带...
  • 1、登录后存储用户对象的redis函数 @Autowired private StringRedisTemplate redisTemplate; @PostMapping(value = "/login") public R login(UserInfo userInfo){ String uuid = Utils.getUUID(); String ...
  • 用户登录后,使用 localStorage 方法在浏览器客户端直接保存 user_id,每次进入网站时,通过识别 user_id 自动获取用户的信息并实现登录。 错误点 浏览器 localStorage 保存的数据可能被——篡改 在浏览器控制台使用...
  • 一般APP都是刚安装后,第一次启动时需要登录(提示你需要登录或者...APP是怎么保持登录状态的? 之所以突然写这个话题,是因为昨晚无意间刷知乎刷到了这个问题iOS系统如何实现app登录类似微信只需登录一次,退出...
  • 首先,用户登录输入用户名和密码,浏览器发送post请求,服务器后台获取用户信息,查询数据库验证用户信息是否正确。如果验证通过,就会创建session来存储相关信息,并且生成一个cookie字符串,把sessionID放在cookie...
  • 先说下背景,项目包含一个管理系统(web)和门户网站(web),还有一个手机APP(包括Android和IOS),三个系统共用一个后端,在后端使用shiro进行登录认证和权限控制。好的,那么问题来了web和APP都可以用shiro认证...
  • php用token登录认证

    千次阅读 2019-12-17 14:32:21
    2.后端将账号密码作处理加密生成token,并返回给前端 3.前端将token存入缓存,在每次请求时,...实现登录状态保持与身份认证的方式通常有两种:session结合数据库、token。 两者相比较,token有较多优点。 ① to...
  • 登录 token redis key的生成 并限制用户只能登录1个 当登录两个浏览同时访问时会挤掉另外一个 或者可以登录多个账号 这个自己根据自己的需求设计 生成token使用 redis 进行...当用户登录成功时 拿用户id 进行加密 并且
  • 【JAVA】基于Token用户验证

    万次阅读 2018-07-23 08:51:33
    背景 传统的用户验证是基于session自身的特性...因为认证的记录是保存在内存中,意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。...
  • 通常用户登录的时候,服务器根据用户名和密码在服务器数据库中校验该用户是否正确,校验正确后则可以根据用户ID和时间戳等属性加密生成一个Token,并返回给浏览器。 生成一个ticket的例子: WebUtils.saveCookie...
  • Vue保持用户登录及权限控制

    千次阅读 2019-05-20 17:59:10
    vue使用vue-router和vuex对用户进行登录状态控制及用户权限控制
  • ssm项目实现用户登陆持久化——token

    万次阅读 2019-04-05 15:32:54
    利用Jedis和JWT创建用户token 1、JWT创建token maven依赖: <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> ...
  • 1.前后端分离后,前端登录状态保持一般采用webstorage或是cookie来保存token用户信息的方式来维持登录状态。如果webstorage或是cookie中没有token,则前端认为是没有登录,拦截到登录页面。vue中利用路由的before...
  • WMS系统对监管仓进行访问(监管仓内嵌于WMS系统),但是需要登录监管仓系统才能看到引入WMS系统的界面,否则看不了监管仓。这里涉及到一个监管仓访问超时的问题:如果用户一直在WMS上操作,而对监管仓不闻不问,那么...
  • token的作用:和PC登陆的session一样,作为用户进入的唯一票据 ... 所以为了保证移动端和服务端数据...因为APP端没有和PC端一样的session机制,所以无法判断用户是否登陆,以及无法保持用户状态,所以就需要一种机制来...
  • 微信小程序Token登录验证

    千次阅读 2021-02-24 23:28:48
    上图是微信开发文档提供的图。 最近开发一款小程序,看了许久的微信文档,这里来记录一下其中的...前端以后每次请求都会携带该自定义登录状态,后端进行登录状态的判断,正常就返回业务数据,否则重新登陆,获取新的.
  • iOS开发中保持用户登录状态

    千次阅读 2018-07-10 21:35:24
    一、利用保存Cookie值实现1、第一次登录成功后保持Cookie: /** 保存登录的Cookie*/ NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; NSData *cookiesData = [NSKeyedArchiver ...
  • 因为当用户登录时,先在数据库查询用户信息,储存一个session在服务器,返回cookie信息在浏览器,cookie信息会随着用户发送请求而发送到服务器,之后服务器检查session来验证用户身份。 这很适合传统的应用,但是...
  • Session、Cookie、Token、单点登录HTTP无状态Cookiecookie认证流程图缺点Session认证过程session认证的流程图token认证token认证的流程图优缺点JWT认证JWT认证流程图基于session认证的单点登录单点登录基于session...
  • 移动端项目和网站还是多多少少的区别的,拿这个用户登陆过期验证这个流程来说吧,一般的网站是不会做处理的,他们访问的时候会自动验证Cookie的有效期的,移动端这样处理就不行的,他是不会保存Cookie的,所以我们在...
  • 用户登录了,就获得登录凭证(sessionid或token),这个凭证是你下次访问要传回给服务端验证身份,保持状态的,所以,你要“保存”在客户端。 相同点: 所有的方式目的都是为了验证用户状态。 都需要在客户端存储凭证...
  • 代理登录token,ticket

    万次阅读 2015-11-29 20:34:11
    SSO,单一登录(single sign-on),意思是指在多套系统并存的环境下,用户只需登录一次即可访问其他授权的系统。 提起SSO(单一登录),大概企业里的IT人员无人不知,但真正意识到其复杂度的,未必有多少,只有亲身...
  • 一种类似于原生比特币 UTXO 的 Token ,将能够利用 Bitcoin SV 网络能提供的所有好处,使其能在不牺牲潜在效用的情况下尽可能简单而高效。
  • 通常的登录业务,按照 token 随机生成的话,不同设备拥有不同的 token ,根据 token 来作为 key 保存登录数据,是可以同时登录同一个帐号,并且都保持在线的。因为这些 token 里面如果存登录状态的话,都会是已登录...
  • 实现此功能的场景是在当下用户对手机APP体验要求高,并且相对安全前提的推动下诞生;当你下载了一个QQ,微信第一次进行了账号和密码的登录,你从此以后打开应用免去了你每日打开应用都要输入账号跟密码的痛苦过程,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,791
精华内容 9,116
关键字:

利用token保持用户登录