微信公衆號開發:獲取openId和用戶信息(完整版)

注:之前總結怎麼進行本地公衆號開發調試,時間一長忘記開發配置卻忘了,所以這裏記錄一下公衆號開發配置,方便快速上手。

目錄

開發前服務器配置

網頁授權獲取用戶基本信息

snsapi_base

snsapi_userinfo

用戶管理-獲取用戶基本信息

 


 

要進行微信公衆號開發,那麼要申請一個微信公衆號就必不可少了。現在微信公衆號類型有這幾種:訂閱號,企業號,服務號。關於三者的差別和介紹可以參考微信公衆號官網微信公衆平臺。申請通過之後,就能登陸微信公衆平臺管理平臺進行開發設置了。

每個公衆號申請成功後,微信服務那邊就會給每個公衆號分配一個與公衆號唯一性綁定的APPID。結合我們公衆平臺自己生成的密鑰,兩者就可以唯一確定某個公衆號以及是否合法了。接下來就應該參照微信公衆平臺開發文檔來進行開發前的配置設置。

開發前服務器配置

按照文檔所說,接入微信公衆平臺開發,開發者需要按照如下步驟完成:

1. 填寫服務器配置
2. 驗證服務器地址的有效性
3. 依據接口文檔實現業務邏輯

接下來就上述每個步驟進行說明好了。

(1) 填寫服務器配置
在申請成功公衆號後,登入web微信公衆號管理平臺,在管理平臺首頁左邊的導航欄選擇: 開發 --> 基本配置。就會進入改公衆號的開發基本配置管理。就可以看到有個區域是服務器配置,這個服務器配置,就是填寫我們將開發測試完成後的項目部署所在的服務器,且要填寫已經備案後域名地址(若是要進行微信支付開發)。(主要這裏的配置要在後臺同時配置,然後發佈到服務器,在進行token驗證)

image


在填寫完所有服務器配置信息後,點擊提交,那麼微信服務器會發送一個GET請求到我們上述URL填寫的地址上,我們服務器上通過接收微信服務器發送請求進行按照某種規則進行處理,將得到的結果返回微信服務器,進行判斷我們的服務器是否通過校驗,那麼我們服務器上的代碼要如何處理這個校驗請求呢,往下看。

 

(2) 驗證服務器地址的有效性:
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:

參數          描述
signature   微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp   時間戳
nonce       隨機數
echostr     隨機字符串

開發者通過檢驗signature對請求進行校驗,若確定此次GET請求來着微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。(這一步也就是向微信服務器說明,上述我們配置的服務器確實是我們項目所在服務器,在接下來的開發,測試過程中,都會在外網的這個服務器上進行,微信那邊會認爲是合法的)

加密/校驗流程如下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信

好了,來看看我們在java後臺中,如何對微信這個請求進行處理的:結合上圖的URL地址,會通過springmvc被路由派發到指定類的指定方法中進行處理。

@Controller(value="WXConfigUtil")
@Qualifier(value="WXConfigUtil")
@RequestMapping(value="/wXConfigUtil")
public class WXConfigUtil{
    
    //這個token要與公衆平臺服務器配置填寫的token一致
    private final static String token = "wechat";
    private Log log = LogFactory.getLog(WXConfigUtil.class);
    
    @RequestMapping(value="/WXConfig",method=RequestMethod.GET)
    @ResponseBody
    public String verifyWXConfig(@RequestParam(value="signature",required=false) String signature,
                                    @RequestParam(value="timestamp",required=false) String timestamp,
                                    @RequestParam(value="nonce",required=false) String nonce,
                                    @RequestParam(value="echostr",required=false) String echostr) {
        System.out.println(" PARAM VAL: >>>" + signature + "\t" + timestamp + "\t" + nonce + "\t" + echostr);
        log.info("開始簽名驗證:"+" PARAM VAL: >>>" + signature + "\t" + timestamp + "\t" + nonce + "\t" + echostr);
        if (StringUtils.isNotEmpty(signature) && StringUtils.isNotEmpty(timestamp)
                &&StringUtils.isNotEmpty(nonce) && StringUtils.isNotEmpty(echostr)) {
            String sTempStr = "";
            try {
                sTempStr = SHA1.getSHA1(timestamp, nonce, token, "");
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (StringUtils.isNotEmpty(sTempStr) && StringUtils.equals(signature, sTempStr)) {
                log.info("驗證成功:-----------:"+sTempStr);
                return echostr;
            } else {
                log.info("驗證失敗:-----------:00000");
                return "-1";
            }
        } else {
            log.info("驗證失敗:-----------:11111");
            return "-1";
        }
    }
    

通過校驗後,會在公衆號的服務器配置頁面有提示的,通過校驗後,後面就可以在此服務器上進行開發與測試了。
(3)依據接口文檔實現業務邏輯
用戶向公衆號發送消息時,公衆號方收到的消息發送者是一個OpenID,是使用用戶微信號加密後的結果,每個用戶對每個公衆號有一個唯一的OpenID。

此外,由於開發者經常有需在多個平臺(移動應用、網站、公衆帳號)之間共通用戶帳號,統一帳號體系的需求,微信開放平臺(open.weixin.qq.com)提供了UnionID機制。開發者可通過OpenID來獲取用戶基本信息,而如果開發者擁有多個應用(移動應用、網站應用和公衆帳號,公衆帳號只有在被綁定到微信開放平臺帳號下後,纔會獲取UnionID),可通過獲取用戶基本信息中的UnionID來區分用戶的唯一性,因爲只要是同一個微信開放平臺帳號下的移動應用、網站應用和公衆帳號,用戶的UnionID是唯一的。換句話說,同一用戶,對同一個微信開放平臺帳號下的不同應用,UnionID是相同的。詳情請在微信開放平臺的資源中心-移動應用開發-微信登錄-授權關係接口調用指引-獲取用戶個人信息(UnionID機制)中查看。

網頁授權獲取用戶基本信息

如果用戶在微信客戶端中訪問第三方網頁,這個場景就是在我們公衆號中通過菜單或者其他連接地址訪問我們自己開發的三方網頁,公衆號可以通過微信網頁授權機制來獲取用戶基本信息,從而實現業務邏輯。詳情參考:網頁授權獲取用戶基本信息

微信對於這個微信用戶訪問的三方頁面的授權是通過OAuth2.0鑑權的,現在很普遍的一個用戶授權機制。在官方文檔中有說明,若是需要在網頁中授權操作,那麼需要填寫配置授權回調域名。僅僅是填寫一個不帶http或者https的域名字符串。該授權回調域名會在下面的網頁授權過程中,重定向的時候進行域名校驗。若是不填寫,或者填寫有誤,則網頁授權接口調用會失敗。

在微信公衆號管理平臺首頁中,點擊左邊導航欄:"設置" ---> "公衆號設置" --->"功能設置"。就會看到包括圖片水印,業務域名,JS接口安全域名,網頁授權域名。我們要設置的就是網頁授權回調域名,點擊網頁授權域名欄的設置按鈕,進行域名設置:
(例如直接寫 wx.example.com)

image


只是需要下載圖片上的一個text文件,上傳到服務器指定位置,能通過url直接訪問,讓微信服務器可以訪問進行字符串對比校驗即可,配置成功。

 

在微信客戶端的網頁開發的授權中,有兩種授權範圍scope:snsapi_basesnsapi_userinfo

1、以snsapi_base爲scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面)
2、以snsapi_userinfo爲scope發起的網頁授權,是用來獲取用戶的基本信息的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關注,就可在授權後獲取該用戶的基本信息。
3、用戶管理類接口中的“獲取用戶基本信息接口”,是在用戶和公衆號產生消息交互或關注後事件推送後,
才能根據用戶OpenID來獲取用戶基本信息。這個接口,包括其他微信接口,都是需要該用戶(即openid)關注了公衆號後,才能調用成功的。

可以看到,在微信公衆號開發中,對與獲取微信用戶信息其實是有幾種不同的方式的。分別針對不同的實際場景下,若是要獲取的微信用戶並沒有關注我們的公衆號,我們只能通過網頁授權auth2.0,來讓頁面顯示提示獲取用戶信息,讓用戶來決定是否同意讓我們公衆號來獲取他信息;另一方面,若是微信用戶已經關注我們的公衆號話,我們就有權限直接通過指定接口獲取用戶信息,而無需讓用戶授權。

下面來說說通過網頁授權方式,獲取未關注公衆號的微信用戶信息。

snsapi_base

這個授權叫"靜默授權",意思就是在用戶打開我們開發的三方網頁頁面的時候,並不會顯示的彈出一個授權頁面,讓用戶知道要授權。而是進入頁面就默認可以獲取用戶的openId。這個靜默授權僅僅只能拿到微信用戶的openId就結束了。

(1) 獲取code
必須是在微信客戶端,引導微信用戶訪問下面文檔指定的url。注意,我們可以修改的僅僅是接口中重定向redirect_uri部分,可以重定向到我們自己開發的頁面中。這裏要注意的是:<font color="red">這個重定向的url,跳轉回調redirect_uri必須要經過URLEncoder編碼</font>。

參考鏈接(請在微信客戶端中打開此鏈接體驗)
Scope爲snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387
&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60
&response_type=code&scope=snsapi_base&state=123#wechat_redirect

看看在java項目中,如何進行這個操作:

    @RequestMapping(value="/routerToMyPage.html",method=RequestMethod.GET)
    public void redirectToMyPage(HttpServletRequest request,HttpServletResponse response){
        StringBuffer sb = new StringBuffer();
        StringBuffer encodeUrl = new StringBuffer(300);
        //公衆號中配置的回調域名(網頁授權回調域名)
        String doname = ConfigService.getValue("DONAME", "doname");
        String root = request.getContextPath();
        String appId = Constants.APPID;

        sb.append("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
        sb.append(appId);
        String url = "";
        try {
            //對重定向url進行編碼,官方文檔要求
            encodeUrl.append(doname).append(root).append("/my/myPage.html");
//          url = URLEncoder.encode(encodeUrl.toString(), "utf-8");
            url = URLEncoder.encode("https://domain/xbdWXBG(項目名稱)/my/myPage.html", "utf-8");
            sb.append("&redirect_uri=").append(url);
            //網頁授權的靜默授權snsapi_base
            sb.append("&response_type=code&scope=snsapi_base&state=123#wechat_redirect");
            response.sendRedirect(sb.toString());
        } catch (UnsupportedEncodingException e) {
            log.error("重定向url編碼失敗:>>" + e.getMessage());   
            e.printStackTrace();
        } catch (Exception e) {
            log.error("response重定向失敗:>>" + e.getMessage());   
            e.printStackTrace();
        }
    }

在上述代碼中,當用戶進入到routerToMyPage.html頁面進行請求,那麼就能通過回調uri進行我們其他的頁面中,就能拿到code。因爲在跳轉到重定向頁面過程中,微信服務器會將一個請求參數code值攜帶在請求url中。

(2) 得到openId
在靜默授權的第(1)步中,頁面會攜帶code參數,重定向跳轉到myPage.html頁面中,那麼我們就可以在這個頁面中獲取code的值,並根據該值調用指定接口獲得當前微信用戶的openId。

    @RequestMapping(value="/myPage.html",method=RequestMethod.GET)
    public ModelAndView toMyPage(HttpServletRequest request,HttpServletResponse response){
        ....
        
        ModelAndView mv = new ModelAndView("/mypage/mypage");
        //獲取重定向攜帶的code參數值
        String code = request.getParameter("code");

        Object openId = "";
        
        if (null == openId) {
            /*
             * 根據得到的code參數,內部請求獲取openId的方法。
             */
            openId = getOpenId(request,response,code);
        }
        
        log.info("session中得到的openId值爲:>>" + String.valueOf(openId));
        
        //根據openId查詢用戶信息
        Users user = myPageService.getUserByOpenId(String.valueOf(openId));

        ...
        return mv;
    }

    //發送請求,根據code獲取openId
    public String getOpenId(HttpServletRequest request, HttpServletResponse response,String code) {
        
        String content = "";
        String openId = "";
        String unionId = "";
        //封裝獲取openId的微信API
        StringBuffer url = new StringBuffer();
        url.append("https://api.weixin.qq.com/sns/oauth2/access_token?appid=")
        .append(Constants.APPID)
        .append("&secret=")
        .append(Constants.APPSECRET)
        .append("&code=")
        .append(code)
        .append("&grant_type=authorization_code");
        
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            content = HttpClient.requestGet(url.toString());
            Map map = objectMapper.readValue(content, Map.class);
            openId = String.valueOf(map.get("openid"));
            unionId = String.valueOf(map.get("unionid"));
            
            log.info("獲取的openID:" + openId);
            /*
             * 將openId保存到session中,當其他業務獲取openId時,
             * 可先從session中獲取openId.
             */
            request.getSession().setAttribute("openId", openId);
        } catch (JsonParseException e) {
            log.error("json解析失敗:", e);
        } catch (JsonMappingException e) {
            log.error("map轉換成json失敗:", e);
        } catch (Exception e) {
            log.error("http獲取openId請求失敗:", e);
        }
        return openId;
    }

可以看到getOpenId方法中,通過code值和appid,secret發送了一個http請求,用於獲取用戶的openId,請求成功返回如下格式內容:

{
   "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
   "openid":"OPENID",
   "scope":"SCOPE"
}
##參數說明
access_token    網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同
expires_in      access_token接口調用憑證超時時間,單位(秒)
refresh_token   用戶刷新access_token
openid          用戶唯一標識,請注意,在未關注公衆號時,用戶訪問公衆號的網頁,也會產生一個用戶和公衆號唯一的OpenID
scope           用戶授權的作用域,使用逗號(,)分隔

因爲同一個微信用戶對每一個微信公衆號來說,都有唯一的標識就是這個openId。所以,我們拿到openId就能針對這個指定用戶來做一些其他的業務操作,靜默授權snsapi_base就到此結束了,並不會獲取得到微信的用戶信息。

snsapi_userinfo

若是不僅僅想要獲取微信用戶的openId,還想獲取未關注公衆號的微信用戶信息,那麼可以通過snsapi_userinfo授權來實現。
(1) 重定向獲取code

Scope爲snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60
&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code
&scope=snsapi_userinfo&state=STATE#wechat_redirect

當微信用戶點擊這個頁面,會跳出授權頁面,如下圖:

 

image

(2) 得到openId
與靜默授權一樣,重定向到我們開發的三方頁面,則可以先獲取code值,在根據code值發送下面的連接請求,得到openId:

//通過request.getParameter("code")獲取code
獲取code後,請求以下鏈接獲取access_token: 
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

可以參考靜默授權java代碼實現詳情,此處省略。

(3) 獲取個人信息
在拿到微信用戶對應的openId之後,因爲之前用戶已經同意授權後,就能通過以下請求連接獲取未關注的用戶個人信息:

http:GET(請使用https協議)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

此處要注意的是access_token值,這個access_token的值是上面(2)方法調用返回的token,並不是JSSDK網頁調用基礎支持全局的token。響應返回json格式的用戶個人信息。

用戶管理-獲取用戶基本信息

微信公衆號開發文檔中,有指定的api 接口可以讓我們調用,獲取微信用戶的基本信息。這個接口調用的成功的前提條件是:所要獲取的微信用戶信息是已經關注了我們的微信公衆號的。若是該微信用戶沒有關注,則不能通過此接口調用,只能通過上述的網頁授權方式獲取用戶信息。詳情參考:用戶管理-獲取用戶基本信息

(1) 獲取用戶基本信息api
文檔中聲明的調用接口如下:

http請求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

## 參數說明
access_token    是   調用接口憑證
openid  是   普通用戶的標識,對當前公衆號唯一
lang    否   返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語

這裏要注意的是這個access_token是微信接口調用的憑證。與網頁授權通過code拿到的access_token是不同的。這個接口憑證,是全局token,也就是說,若是項目中要調用所有微信其他jssdk等接口,請求url參數中多數時候都是需要這個參數token值的。具體的可以查看下面的第(2)步獲取全局token。再次,就設定已經拿到了全局接口調用的access_token,並將該token保存到內存中。看看java中如何調用接口獲取微信用戶信息。

    public Users getWechatUserInfo(String openId) {
        //獲取保存在內存中的全局接口調用access_token
        String accessToken = Constants.ACCESS_TOKEN;
        log.info("全局token>>" + accessToken);

        //構造獲取用戶基本信息api
        StringBuffer url = new StringBuffer();
        url.append("https://api.weixin.qq.com/cgi-bin/user/info?")
           .append("access_token=").append(accessToken)
           .append("&openid=").append(openId).append("&lang=zh_CN");
        
        String content = "";
        ObjectMapper objectMapper = new ObjectMapper();
        Users user = null;
        try {
            for (int i = 1; i <= 3; i++) {
                //content就是json格式的用戶信息
                content = httpUtil.executeGet(url.toString());
                log.info("獲取微信用戶請求響應信息:>>" + content);
                Map map = objectMapper.readValue(content, Map.class);
                Object mopenId = map.get("openid");
                Object nickName = map.get("nickname");
                log.info("第" + i + "次獲取openId=" + openId + "的微信用戶暱稱:>>"+ nickName);
                if (openId.equals(mopenId) && nickName != null) {
                    /*
                     * 獲取微信用戶基本信息成功,並將信息封裝到平臺用戶對象中。
                     */
//                  user = myPageDao.getUserByOpenId(openId);
                    user = new Users();
                    if(user != null) {
                        user.setNickname(String.valueOf(nickName));
//                      user.setName(String.valueOf(nickName));
                        user.setSex((Integer) map.get("sex"));
                        user.setPictureURL(String.valueOf(map.get("headimgurl")));
                        user.setOpenid(String.valueOf(mopenId));
                        user.setUnionID(String.valueOf(map.get("unionid")));
                    }
                    log.info("調用微信得到的用戶信息:>>" + user.getNickname() + ",photo>>"+ user.getPictureURL());
                    return user;
                }
                log.info("第" + i + "次獲取openId=" + openId + "的微信用戶信息失敗!!");
            }

        } catch (JsonParseException e) {
            log.error("獲取微信基本用戶信息時,json轉換失敗:>>", e);
            e.printStackTrace();
        } catch (Exception e) {
            log.error("http請求執行錯誤:>>", e);
            e.printStackTrace();
        }
        return user == null ? new Users() : user;
    }

(2) 獲取全局接口調用token
access_token是公衆號的全局唯一票據,公衆號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將導致上次獲取的access_token失效。詳情:獲取access token

我們可以通過定時器定時調用獲取token的api請求,得到這個access_token就保存在內存中,若是其他接口需要使用,直接調用即可。這裏官方也有說明:如果第三方不使用中控服務器,而是選擇各個業務邏輯點各自去刷新access_token,那麼就可能會產生衝突,導致服務不穩定。,也就是不建議我們頻繁的手動調用這個api來更新access_token。

http請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

## 參數說明
grant_type  是   獲取access_token填寫client_credential
appid   是   第三方用戶唯一憑證
secret  是   第三方用戶唯一憑證密鑰,即appsecret

## 返回
{"access_token":"ACCESS_TOKEN","expires_in":7200}

來看看java中如何獲取這個全局接口調用token:

    private void getAccessToken() {
        StringBuffer url = new StringBuffer();
        url.append("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential")
           .append("&appid=").append(Constants.APPID)
           .append("&secret=").append(Constants.APPSECRET);
        log.info("獲取全局accesss_token的請求:>>" + url.toString());
        try {
            String content;
            ObjectMapper objectMapper = new ObjectMapper();
            /*
             * 發送請求獲取access_token,最多發送3次請求進行獲取。
             */
            for(int i = 1; i <= 3; i++) {
                if(httpUtil == null) {
                    httpUtil = new HttpUtil();
                }
                content = httpUtil.executeGet(url.toString());
                try {
                    Map map = objectMapper.readValue(content, Map.class);
                    Object at = map.get("access_token");
                    log.info("第" + i + "次定時器獲取全局access_token:>>" + at);
                    if(null != at) {
                        //刷新內存中的全局ACCESS_TOKEN值。
                        Constants.ACCESS_TOKEN = String.valueOf(at);
                        log.info("全局access_token刷新成功!!");
                        break;
                    }
                    log.info("全局access_token刷新失敗!!");
                } catch (Exception e) {
                    log.error("獲取全局access_token時,json轉換失敗:" + e.getMessage());
                    break;
                }
            }
    
        } catch (Exception e) {
            log.error("獲取全局access_token失敗:" + e.getMessage());
        }
        
    }

在來多說幾句,這個如何用定時器來統一刷新內存中全局token,主要結合quartz定時器來實現。
第一步,要先引入定時器quartz依賴庫:

        <!-- 定時器 -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>1.8.6</version>
        </dependency>

第二步,實現定時器調用的job具體實現類:

@Service("accessTokenService")
public class AccessTokenService {

    //定時器調用方法
    public void execute() {
        getAccessToken();//上述代碼已經列出
    }

    /**
     * refresh: 提供一個入口,進行強制手動刷新token。
     */
    public static void refresh() {
        new AccessTokenService().getAccessToken();
    }

}

第三步,在spring配置文件中配置定時器:

## applicationContext.xml
    <!-- 應用程序定時器配置 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="accessTokenTrigger" />
            </list>
        </property>
        <property name="autoStartup" value="true" />
    </bean>

    <!-- 配置定時器:每2小時刷新一次微信接口調用全局token -->
    <bean id="accessTokenTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="tokenJobDetail" />
        <property name="cronExpression" value="0 0 */2 * * ?" /><!-- 每隔2個小時觸發一次 -->
    </bean>
    <bean id="tokenJobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="accessTokenService" />
        <property name="targetMethod" value="execute" />
        <property name="concurrent" value="false" />
        <!-- 是否允許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->
    </bean>

第四步,要使這個定時器在服務器啓動時候,必須調用一次。基於服務器啓動時間,每間隔2個小時就進行token刷新:
需要我們在web.xml配置文件中配置監聽器listener,定義一個在服務器啓動時候,就進行調用的類方法。

## web.xml
<listener>
    <listener-class>com.cybbj.utils.AccessTokenInit</listener-class>
</listener>


## AccessTokenInit.java 集成ServletContextListener實現服務器啓動監聽
public class AccessTokenInit implements ServletContextListener{

    public void contextInitialized(ServletContextEvent sce) {
            AccessTokenService.refresh();
    }

    public void contextDestroyed(ServletContextEvent sce) {
        
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章