11111111111
知識共享平臺
知識共享平臺

討教大學平臺

  • 首頁
  • 免費課
  • 精品課
  • 討教題庫
  • 企業服務

    hot

  • 下載APP
  • 證書查詢
  • 關于我們
我問
討教號
搜索
消息
  • 我的文章

    我的關注

    我的問答

    我的秘密

    我的評論

    我的訂閱

    我的打賞

    我的錢包

    我的通知

    我的設置

    退出登錄

  • ×

    登錄

    討教 | 通行證

    登錄
    立即注冊
    忘記密碼?
    使用微信登錄

    提問 ×

    寫下你的問題,準確的表述更容易得到答案

    類型話題

    選擇支付方式
    您的討教幣 111 付費金額

    国产第一亚洲_浪货一天不做就难受呀_欧洲视频在线观看_亚洲精品一区二区三区美女

        Token認證,如何快速方便獲取用戶信息 尹吉歡 JAVA葵花寶典 今天

        JAVA葵花寶典
        2019-06-28 17:28:58
        16篇 作品
        2282 總閱讀量

        背景

        我們有一個Web項目,這個項目提供了很多的Rest API。也做了權限控制,訪問API的請求必須要帶上事先認證后獲取的Token才可以。

        認證的話就在Filter中進行的,會獲取請求的Token進行驗證,如果成功了可以得到Token中的用戶信息,本文的核心就是講解如何將用戶信息(用戶ID)優雅的傳遞給API接口(Controller)。

        方式一(很挫)

        我們在Filter中進行了統一攔截,在Controller中獲取用戶ID的話,仍然可以再次解析一遍Token獲取用戶ID

        1. @GetMapping("/hello")

        2. public String test(HttpServletRequest request) {

        3. String token = request.getHeader("token");

        4. JWTResult result = JWTUtils.checkToken(token);

        5. Long userId = result.getUserId();

        6. }

        方式二(優雅)

        方式一需要重新解析一遍Token, 浪費資源。我們可以直接將Filter中解析好了的用戶ID直接通過Header傳遞給接口啊。

        1. @Override

        2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        3. throws IOException, ServletException {

        4. HttpServletRequest httpRequest = (HttpServletRequest) request;

        5. HttpServletResponse httpResponse = (HttpServletResponse) response;

        6. String token = request.getHeader("token");

        7. JWTResult result = JWTUtils.checkToken(token);

        8. Long userId = result.getUserId();

        9. HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {

        10. @Override

        11. public String getHeader(String name) {

        12. if (name.equals("loginUserId")) {

        13. return userId .toString();

        14. }

        15. return super.getHeader(name);

        16. }

        17. };

        18. chain.doFilter(requestWrapper, httpResponse);

        19. }

        接口中直接從Header中獲取解析好了的用戶ID:

        1. @GetMapping("/hello")

        2. public String save2(HttpServletRequest request) {

        3. Long userId = Long.parseLong(request.getHeader("loginUserId"));

        4. }

        方式三(很優雅)

        通過Header傳遞確實很方便,但如果你有代碼潔癖的話總會覺得怪怪的,能不能不用Header方式,比如說我就在方法上定義一個loginUserId的參數,你給我直接注入進來,這個有點意思哈,下面我們來實現下:

        GET參數方式

        在Filter中追加參數:

        1. @Override

        2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        3. throws IOException, ServletException {

        4. HttpServletRequest httpRequest = (HttpServletRequest) request;

        5. HttpServletResponse httpResponse = (HttpServletResponse) response;

        6. String token = request.getHeader("token");

        7. JWTResult result = JWTUtils.checkToken(token);

        8. Long userId = result.getUserId();

        9. HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {

        10. @Override

        11. public String[] getParameterValues(String name) {

        12. if (name.equals("loginUserId")) {

        13. return new String[] { userId .toString() };

        14. }

        15. return super.getParameterValues(name);

        16. }

        17. @Override

        18. public Enumeration getParameterNames() {

        19. Set paramNames = new LinkedHashSet<>();

        20. paramNames.add("loginUserId");

        21. Enumeration names = super.getParameterNames();

        22. while(names.hasMoreElements()) {

        23. paramNames.add(names.nextElement());

        24. }

        25. return Collections.enumeration(paramNames);

        26. }

        27. };

        28. chain.doFilter(requestWrapper, httpResponse);

        29. }

        接口中直接填寫參數即可獲取:

        1. @GetMapping("/hello")

        2. public String save2(String name, Long loginUserId) {

        3. // loginUserId 就是Filter中追加的值

        4. }

        對于post請求,也可以用這種方式:

        1. @PostMapping("/hello")

        2. public String save2(User user, Long loginUserId) {


        3. }

        可是往往我們在用post請求的時候,要么就是表單提交,要么就是json體的方式提交,一般不會使用get方式參數,這也就意味著這個loginUserId我們需要注入到對象中:

        先創建一個參數實體類:

        1. public class User {


        2. private String name;


        3. private Long loginUserId;

        4. }

        先模擬表單提交的方式,看看行不行:

        1. @PostMapping("/hello")

        2. public User save2(User user) {

        3. return user;

        4. }

        用PostMan測試一下,表單方式是直接支持的:再次試下Json提交方式:

        1. @PostMapping("/hello")

        2. public User save2(@RequestBody User user) {

        3. return user;

        4. }

        看下圖,失敗了,得重新想辦法實現下只需要在HttpServletRequestWrapper中重新對提交的內容進行修改即可:

        1. @Override

        2. public ServletInputStream getInputStream() throws IOException {

        3. byte[] requestBody = new byte[0];

        4. try {

        5. requestBody = StreamUtils.copyToByteArray(request.getInputStream());

        6. Map map = JsonUtils.toBean(Map.class, new String(requestBody));

        7. map.put("loginUserId", loginUserId);

        8. requestBody = JsonUtils.toJson(map).getBytes();

        9. } catch (IOException e) {

        10. throw new RuntimeException(e);

        11. }

        12. final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);

        13. return new ServletInputStream() {

        14. @Override

        15. public int read() throws IOException {

        16. return bais.read();

        17. }


        18. @Override

        19. public boolean isFinished() {

        20. return false;

        21. }


        22. @Override

        23. public boolean isReady() {

        24. return true;

        25. }


        26. @Override

        27. public void setReadListener(ReadListener listener) {


        28. }

        29. };

        30. }

        到此為止,我們就可以直接將Token解析的用戶ID直接注入到參數中了,不用去Header中獲取,是不是很方便。

        本網站內容僅代表作者本人的觀點,不代表本網站的觀點和看法,與本網站立場無關,如有侵權請聯系討教。
        給作者打賞,鼓勵TA抓緊創作
        0人打賞金額
        JAVA葵花寶典
        16篇 作品
        2282 總閱讀量
        評論
        您可能感興趣的文章

        項目管理服務模式

        敏捷項目管理與傳統項目管理比較

        項目管理的特點

        PMO是什么?是管項目經理的嘛?

        項目經理必須關注的開會十大關鍵問題!

        項目的組成要素

        熱門話題 更多話題
        精益生產 質量管理 智能制造
        職場效率 項目管理 討教
        AI 大數據 六西格瑪
        ×

        給作者打賞,鼓勵TA抓緊創作!

        選擇支付方式
        選擇打賞金額
        注:打賞的收益歸作者,非平臺

        微信掃描支付

        打賞金額: 1元

        ×

        給作者打賞,鼓勵TA抓緊創作!

        您的討教幣
        填寫您打賞討教幣數量
        輸入密碼

        111

        注:打賞的收益歸作者,非平臺

        微信掃描支付

        打賞金額: 1元

        国产第一亚洲_浪货一天不做就难受呀_欧洲视频在线观看_亚洲精品一区二区三区美女

              欧美成人午夜| 国产精品videossex久久发布| 久久日韩精品| 久久久噜久噜久久综合| 久久综合电影一区| 欧美精品久久久久久久免费观看| 欧美日韩国产在线看| 国产精品久久久久久久久免费| 国产精品久久一卡二卡| 国色天香一区二区| 亚洲人体大胆视频| 亚洲欧美日本视频在线观看| 久久久久久高潮国产精品视| 欧美黑人在线播放| 国产精品乱子乱xxxx| 影音先锋亚洲精品| 亚洲午夜女主播在线直播| 久久精品二区亚洲w码| 欧美日产国产成人免费图片| 国产精品综合| 亚洲国产婷婷| 欧美亚洲自偷自偷| 欧美日本高清| 在线精品国产成人综合| 亚洲欧美国产视频| 欧美福利影院| 国产一区免费视频| 亚洲一区二区三区在线看| 免费试看一区| 国内精品久久久久久影视8| 一区二区欧美亚洲| 欧美成人免费网| 国产综合久久久久久鬼色| 亚洲一区免费网站| 欧美久久一区| 亚洲福利久久| 久久综合色影院| 国产一区白浆| 亚洲欧美在线磁力| 欧美视频在线免费看| 亚洲精品无人区| 欧美1区2区视频| 亚洲大胆视频| 久久一区精品| 精品91在线| 久久久久久夜| 在线播放日韩欧美| 久久青青草原一区二区| 国产日韩在线看| 亚洲欧美卡通另类91av| 欧美色大人视频| 在线一区日本视频| 欧美日韩一区二区三| 99国产精品久久久| 欧美精品videossex性护士| 1769国产精品| 欧美电影免费观看网站 | 欧美一级在线视频| 国产精品美女主播| 亚洲免费视频一区二区| 欧美三级视频| 亚洲欧美日韩精品久久奇米色影视| 国产精品v欧美精品v日韩| 亚洲一级免费视频| 国产精品一区二区久久久久| 欧美亚洲视频一区二区| 国产一区二区高清不卡| 久久久亚洲高清| 亚洲精品一二三| 欧美视频在线观看一区| 亚洲欧美在线一区| 黄色成人av网站| 欧美福利视频一区| 一区二区三区 在线观看视| 国产精品久久久久久一区二区三区| 中文在线不卡| 国产一区二区成人| 欧美极品欧美精品欧美视频| 亚洲一区二区免费在线| 国产一区二区你懂的| 欧美阿v一级看视频| 亚洲私拍自拍| 激情综合网激情| 欧美日韩大陆在线| 欧美与黑人午夜性猛交久久久| 在线观看不卡| 国产精品久久久久婷婷| 久久综合给合久久狠狠狠97色69| 亚洲人成艺术| 欧美精品自拍偷拍动漫精品| 亚洲伊人伊色伊影伊综合网| 在线观看的日韩av| 国产精品久久久91| 免费在线观看成人av| 亚洲欧美精品在线观看| 尤物网精品视频| 国产精品欧美在线| 欧美激情bt| 久久久91精品国产一区二区三区 | 中文久久乱码一区二区| 国产视频亚洲| 欧美午夜不卡| 免费中文日韩| 欧美在线视频免费| 一区二区高清视频| 亚洲黄色在线看| 国产在线麻豆精品观看| 欧美亚州韩日在线看免费版国语版| 久久久久久久精| 亚洲欧美一区二区精品久久久| 亚洲高清久久网| 国产一区视频在线观看免费| 国产精品高潮呻吟视频| 欧美激情第3页| 老司机成人网| 久久国产黑丝| 亚洲欧美日韩国产一区二区| 一本一本久久a久久精品牛牛影视| 永久555www成人免费| 国产亚洲欧洲| 国产日韩亚洲欧美| 国产精品久久久久久五月尺| 欧美日韩综合视频| 欧美日本韩国| 欧美日本国产在线| 欧美另类视频在线| 欧美精品午夜| 欧美日韩亚洲综合一区| 欧美日韩成人综合| 欧美日韩mv| 欧美日韩精品综合| 欧美日韩国产首页| 欧美日韩精品综合| 国产精品久久看| 国产精品亚洲综合色区韩国| 国产伦精品一区| 国产婷婷色一区二区三区| 国产日韩精品在线播放| 国产亚洲激情| 玉米视频成人免费看| 亚洲高清影视| 亚洲看片一区| 亚洲视频一区在线观看| 亚洲视频一二区| 午夜在线一区二区| 久久香蕉精品| 欧美精品激情blacked18| 欧美精品在线极品| 国产精品sm| 国产亚洲精品aa| 亚洲国产精品ⅴa在线观看| 亚洲久久一区| 亚洲欧美视频一区| 久久在线播放| 欧美日韩麻豆| 国产亚洲永久域名| 亚洲激情av| 亚洲男人av电影| 久久久久久久网| 欧美极品在线播放| 国产欧美在线看| ●精品国产综合乱码久久久久| 亚洲毛片在线看| 亚洲欧美日本另类| 欧美成ee人免费视频| 国产精品sss| 亚洲国产色一区| 性欧美video另类hd性玩具| 久久综合中文字幕| 国产精品美女久久久久aⅴ国产馆| 黄色欧美日韩| 亚洲一区在线观看视频| 老司机aⅴ在线精品导航| 欧美三区免费完整视频在线观看| 国内视频精品| 亚洲一区欧美激情| 免费成人在线视频网站| 国产精品任我爽爆在线播放| 亚洲国产专区校园欧美| 性做久久久久久| 欧美午夜电影在线观看| 亚洲国产婷婷| 久久久久国产免费免费| 欧美视频在线观看一区| 亚洲国产福利在线| 欧美亚洲免费在线| 欧美日韩在线不卡一区| 在线看片第一页欧美| 性刺激综合网| 国产精品免费网站在线观看| 亚洲精品一区久久久久久| 久久一区二区三区国产精品| 国产欧美精品一区| 夜夜嗨av色一区二区不卡| 久久人人九九| 韩国成人福利片在线播放| 欧美一级黄色录像| 欧美日韩直播| 亚洲精品一区二区网址| 噜噜噜噜噜久久久久久91|