国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

token驗(yàn)證實(shí)現(xiàn)

fobnn / 1444人閱讀

摘要:在實(shí)現(xiàn)過(guò)程中也找到了不少的好資料,這一篇中用戶驗(yàn)證方案詳細(xì)的介紹了用戶驗(yàn)證的不同方案。另,的失效時(shí)間應(yīng)該設(shè)置多長(zhǎng)需要根據(jù)所在項(xiàng)目的實(shí)際情況確定。

移動(dòng)開(kāi)發(fā)中一定會(huì)涉及后臺(tái)API如何訪問(wèn),如何控制訪問(wèn)權(quán)限,保證系統(tǒng)安全等問(wèn)題。
介紹一下我最近自己做的一個(gè)移動(dòng)端訪問(wèn)后端API的例子,例子寫(xiě)的很粗糙,但是基本實(shí)現(xiàn)了以token auth 為核心的demo。

在實(shí)現(xiàn)demo過(guò)程中也找到了不少的好資料,這一篇《APP中用戶驗(yàn)證方案》詳細(xì)的介紹了APP用戶驗(yàn)證的不同方案。

大體思路:

APP登錄界面輸入用戶信息登錄;服務(wù)端驗(yàn)證登錄信息,驗(yàn)證成功,向APP端發(fā)送token,將token保存到數(shù)據(jù)庫(kù)或者緩存服務(wù)器中;APP登錄成功后,每次調(diào)用后端API時(shí)都需要帶著token、時(shí)間戳、sign(token+時(shí)間戳的md5字符串,sign可以自己定義算法以防止被盜用)信息,以便后臺(tái)驗(yàn)證訪問(wèn)API權(quán)限;后端在接收到APP訪問(wèn)請(qǐng)求時(shí),比對(duì)APP發(fā)送來(lái)的token與緩存服務(wù)器中已經(jīng)存在的token是否一致,并驗(yàn)證token時(shí)效性。

好了,廢話少說(shuō),上代碼:

前端代碼(APP,最近寫(xiě)的APP基本都是H5方式實(shí)現(xiàn)):


        
        

這里的ostData使用的是封裝好的Ajax函數(shù),下面一并放出代碼:

ajax.js:

/*對(duì)ajax進(jìn)行簡(jiǎn)易封裝,便于每次調(diào)用,省去參數(shù)設(shè)置*/
function postData(url, data, headData, callback, waitingDialog) {
    mui.ajax(url,{  
        data:data,  
        dataType:"json",  
        type:"post",
        headers: {
            "token" : headData[0],
            "timesamp" : headData[1],
            "sign" : headData[2]
        },
        contentType:"application/x-www-form-urlencoded; charset=utf-8",  
        timeout:20000,  
        success:callback,
        error:function(xhr,type,errorThrown){  
            //waitingDialog.close();
            alert("<網(wǎng)絡(luò)連接失敗,請(qǐng)重新嘗試一下>", "錯(cuò)誤", "OK", null);  
        }  
    });
}  
ajax中加上了headers參數(shù),這里加headers參數(shù)的目的是,后臺(tái)使用servlet+filter的方式控制訪問(wèn),如果將token等其他參數(shù)直接和表單數(shù)據(jù)同時(shí)提交,filter在獲取token信息后,servlet就不能獲取到表單數(shù)據(jù),這就比較尷尬了,或者后臺(tái)使用AOP的方式控制訪問(wèn)權(quán)限 ,這個(gè)還沒(méi)有來(lái)得及嘗試。如果我能把token信息加到于表單數(shù)據(jù)不同的存儲(chǔ)區(qū)域就好了,Google后找到了可以把數(shù)據(jù)加到請(qǐng)求的header中可以實(shí)現(xiàn)將token數(shù)據(jù)與表單數(shù)據(jù)分離的效果。

過(guò)濾器(Java實(shí)現(xiàn) JDK1.8 Tomcat8.5.6):

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

import me.wlc.wx.web.tool.Md5;

/**
 * 使用注解標(biāo)注過(guò)濾器
 * @WebFilter將一個(gè)實(shí)現(xiàn)了javax.servlet.Filte接口的類定義為過(guò)濾器
 * 屬性filterName聲明過(guò)濾器的名稱,可選
 * 屬性u(píng)rlPatterns指定要過(guò)濾 的URL模式,也可使用屬性value來(lái)聲明.(指定要過(guò)濾的URL模式是必選屬性)
 * urlPatterns="/*" 表示過(guò)濾掉所有請(qǐng)求
 */
@WebFilter(filterName="AccessFilter",urlPatterns="/*")
public class AccessFilter implements Filter {

    @Override
    public void destroy() {
        
        System.out.println("過(guò)濾器銷毀");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("執(zhí)行過(guò)濾操作");
        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI();
        System.out.println("uri is :  " + uri);
        
        //對(duì)請(qǐng)求的uri(即api)進(jìn)行判斷,如果是登錄的uri則直接放行,如果是其他api則對(duì)sign進(jìn)行驗(yàn)證操作
        if( !uri.endsWith("loginServlet") ){
            //從請(qǐng)求的url中取出token、時(shí)間戳、sign
            String token = req.getHeader("token");
            String timesamp = req.getHeader("timesamp");
            String sign = req.getHeader("sign");
            System.out.println("sign is :  " + sign);
            
            StringBuffer requestUrl = req.getRequestURL();
            System.out.println("請(qǐng)求的Url是:   " + requestUrl);
            
            //對(duì)token、timesamp 進(jìn)行md5計(jì)算
            String signMd5 = Md5.getMD5(token + timesamp);
            if(sign.equals(signMd5)){
                //簽名通過(guò)
                chain.doFilter(request, response);
            }else{
                //簽名不通過(guò),向app后端發(fā)送錯(cuò)誤信息,提示重新登錄
                
            }    
        }else{
            //登錄操作
            chain.doFilter(request, response);
        }
        
        //請(qǐng)求通過(guò)
        //chain.doFilter(request, response);
        
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        
        System.out.println("過(guò)濾器初始化");
        
    }

}

后端還沒(méi)有實(shí)現(xiàn)驗(yàn)證token時(shí)效性功能,也沒(méi)有將token存儲(chǔ)到緩存服務(wù)器中,這些需要具體方案定下來(lái)以后再加上了。再說(shuō)一句,生成的token保證token值唯一即可,可以使用最方便的UUID(Java中)。

大體就是這樣了,有問(wèn)題隨時(shí)提給我哦!

PS:2018年9月28日更新
一直沒(méi)有登錄查看留言,給留言板的各位兄弟道個(gè)歉,沒(méi)有及時(shí)回復(fù)

token存儲(chǔ)方案:

方案一:使用session的超時(shí)時(shí)間來(lái)控制token的失效時(shí)間
方案二:使用redis存儲(chǔ)token的失效時(shí)間

方案一適用于單機(jī)環(huán)境,可以作為小型系統(tǒng)的token時(shí)效性驗(yàn)證方案,此方案若處于分布式環(huán)境會(huì)導(dǎo)致session在分布式機(jī)器間的時(shí)間不同步,但跟組里的其他工程師溝通,在分布式環(huán)境下是不是還可以同步session?

方案二適用于大型系統(tǒng),還要使用redis服務(wù),使用redis存儲(chǔ)token可是實(shí)現(xiàn)快速讀取token時(shí)效數(shù)據(jù),若將toke失效時(shí)間存儲(chǔ)到數(shù)據(jù)庫(kù)中,頻繁操作數(shù)據(jù)庫(kù),會(huì)影響數(shù)據(jù)庫(kù)的響應(yīng)時(shí)間,進(jìn)而應(yīng)用程序也會(huì)出現(xiàn)卡頓等情況。

另,token的失效時(shí)間應(yīng)該設(shè)置多長(zhǎng)需要根據(jù)所在項(xiàng)目的實(shí)際情況確定。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82563.html

相關(guān)文章

  • 使用JWT(Json Web Token)實(shí)現(xiàn)登錄認(rèn)證

    摘要:今天我們來(lái)結(jié)合實(shí)例給大家講述的實(shí)戰(zhàn)應(yīng)用,就是如何使用前端與后端實(shí)現(xiàn)用戶登錄鑒權(quán)認(rèn)證的過(guò)程。只用了一個(gè)串,建立前后端的驗(yàn)證的數(shù)據(jù)傳遞,實(shí)現(xiàn)了有效的登錄鑒權(quán)過(guò)程。 今天我們來(lái)結(jié)合實(shí)例給大家講述JWT(Json Web Token)的實(shí)戰(zhàn)應(yīng)用,就是如何使用前端Axios與后端PHP實(shí)現(xiàn)用戶登錄鑒權(quán)認(rèn)證的過(guò)程。 文中涉及的重要知識(shí)點(diǎn): axios異步請(qǐng)求:axios-基于Promise的HTT...

    Yu_Huang 評(píng)論0 收藏0
  • JavaMailSender實(shí)現(xiàn)郵箱注冊(cè)驗(yàn)證

    摘要:前言使用郵箱注冊(cè)驗(yàn)證,我們需要理清設(shè)計(jì)思路問(wèn)題一注冊(cè)信息提交后需要對(duì)填寫(xiě)的郵箱號(hào)發(fā)送郵件問(wèn)題二郵件到達(dá)時(shí)用戶如何進(jìn)行激活,是通過(guò)請(qǐng)求還是獲取驗(yàn)證碼本篇使用接口激活問(wèn)題三郵件激活如何設(shè)置有效時(shí)間通過(guò)以上三個(gè)問(wèn)題,博主來(lái)幫助大家掌握郵箱驗(yàn)證問(wèn)題 前言 使用郵箱注冊(cè)驗(yàn)證,我們需要理清設(shè)計(jì)思路: 問(wèn)題一:注冊(cè)信息提交后需要對(duì)填寫(xiě)的郵箱號(hào)發(fā)送郵件 問(wèn)題二:郵件到達(dá)時(shí)用戶如何進(jìn)行激活,是通過(guò)get...

    zeyu 評(píng)論0 收藏0
  • 前后端分離項(xiàng)目 — 基于SpringSecurity OAuth2.0用戶認(rèn)證

    摘要:前言現(xiàn)在的好多項(xiàng)目都是基于移動(dòng)端以及前后端分離的項(xiàng)目,之前基于的前后端放到一起的項(xiàng)目已經(jīng)慢慢失寵并淡出我們視線,尤其是當(dāng)基于的微服務(wù)架構(gòu)以及單頁(yè)面應(yīng)用流行起來(lái)后,情況更甚。使用生成是什么請(qǐng)自行百度。 1、前言 現(xiàn)在的好多項(xiàng)目都是基于APP移動(dòng)端以及前后端分離的項(xiàng)目,之前基于Session的前后端放到一起的項(xiàng)目已經(jīng)慢慢失寵并淡出我們視線,尤其是當(dāng)基于SpringCloud的微服務(wù)架構(gòu)以及...

    QLQ 評(píng)論0 收藏0
  • 如何在SpringBoot中集成JWT(JSON Web Token)鑒權(quán)

    摘要:在使用非對(duì)稱加密算法進(jìn)行簽名的時(shí)候,還可以用于驗(yàn)證的發(fā)件人是否與中申明的發(fā)件人是同一個(gè)人。如果沒(méi)有用非對(duì)稱加密算法的話,把復(fù)制之后直接可以去官網(wǎng)在線解析。 這篇博客主要是簡(jiǎn)單介紹了一下什么是JWT,以及如何在Spring Boot項(xiàng)目中使用JWT(JSON Web Token)。 1.關(guān)于JWT 1.1 什么是JWT 老生常談的開(kāi)頭,我們要用這樣一種工具,首先得知道以下幾個(gè)問(wèn)題。 這...

    yeyan1996 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<