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元

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

              9000px;">

                    韩国成人福利片在线播放| 粉嫩蜜臀av国产精品网站| 蜜臀av一级做a爰片久久| 丁香天五香天堂综合| 精品国产欧美一区二区| 日韩电影在线观看网站| 欧美午夜精品理论片a级按摩| 国产精品久久久久国产精品日日 | 日本不卡在线视频| 欧美日韩国产高清一区二区三区| 亚洲色图制服诱惑 | 欧美一卡二卡在线| 青青草伊人久久| 日韩一区二区三区视频在线观看| 视频一区视频二区中文| 一本一道久久a久久精品| 成人欧美一区二区三区小说 | 欧美剧在线免费观看网站| 亚洲国产精品久久人人爱| 欧美三片在线视频观看 | 精品免费视频一区二区| 国产麻豆一精品一av一免费| 337p日本欧洲亚洲大胆精品 | 综合激情网...| 91在线小视频| 亚洲成人av福利| 欧美电视剧在线看免费| 国产成人av电影在线播放| 国产欧美日韩不卡免费| 色综合天天做天天爱| 亚洲一级二级三级| 久久久久久久av麻豆果冻| 毛片av一区二区| 中文在线免费一区三区高中清不卡| 99国产精品一区| 久久精品国产99国产精品| 国产精品成人在线观看| 99re视频精品| 老司机免费视频一区二区| 国产精品私人影院| 3d动漫精品啪啪一区二区竹菊| 国产一区二区看久久| 久久精品免费在线观看| 欧美手机在线视频| 国产成人免费视频一区| 亚洲曰韩产成在线| 欧美国产丝袜视频| 欧美在线观看一二区| 激情欧美一区二区三区在线观看| 亚洲日本在线观看| 久久综合色婷婷| 欧美日韩国产一二三| 成人性生交大片| 国产精品福利影院| 精品国产一区二区三区忘忧草| 99精品在线观看视频| 狠狠色综合色综合网络| 天堂成人国产精品一区| 国产精品美日韩| 久久亚洲二区三区| 91精品国产免费| 欧美日韩一区视频| 在线观看日韩av先锋影音电影院| 成人免费电影视频| 粉嫩绯色av一区二区在线观看| 蜜桃精品视频在线| 强制捆绑调教一区二区| 亚洲午夜视频在线| 久久久久久电影| 欧美一级二级三级蜜桃| 欧美日韩在线直播| 欧美美女一区二区在线观看| 91丨porny丨户外露出| 成人黄色在线看| av电影在线不卡| 色综合久久综合网欧美综合网| 成人午夜在线播放| 成人手机电影网| 国产91精品在线观看| 国内精品免费**视频| 青青草视频一区| 国产一区999| 国产一区二区不卡| 97久久超碰国产精品| 91在线观看一区二区| 99国内精品久久| 欧美日韩精品欧美日韩精品一综合| 国产另类ts人妖一区二区| 国产乱码精品一区二区三区五月婷| 久草这里只有精品视频| 精品一区免费av| 亚洲欧美在线高清| 亚洲永久免费视频| 日韩二区三区四区| 精品一区二区三区在线观看| 国产盗摄一区二区| 9久草视频在线视频精品| 欧美色精品天天在线观看视频| 欧美精品一区二区三| 天天影视涩香欲综合网| heyzo一本久久综合| 久久综合五月天婷婷伊人| 亚洲激情自拍视频| 不卡免费追剧大全电视剧网站| 日韩欧美一级二级| 午夜久久久久久电影| 91麻豆国产自产在线观看| 欧美成va人片在线观看| 午夜电影久久久| 色婷婷精品久久二区二区蜜臂av| 国产亚洲精品bt天堂精选| 捆绑调教一区二区三区| 欧美视频第二页| 亚洲影院免费观看| 成人精品鲁一区一区二区| 日韩欧美综合一区| 免费高清视频精品| 91麻豆精品国产91久久久久久久久 | 97久久超碰精品国产| 国产日韩精品一区二区三区| 国内偷窥港台综合视频在线播放| 日韩一区二区三区在线| 欧美aa在线视频| 日韩色在线观看| 另类综合日韩欧美亚洲| 欧美一二区视频| 国产一区二三区| 国产免费成人在线视频| 成人一区二区在线观看| 国产欧美一区二区三区鸳鸯浴| 国产精品一区二区久激情瑜伽| 久久综合九色综合97_久久久| 国产一二精品视频| 国产精品嫩草影院av蜜臀| av午夜精品一区二区三区| 亚洲三级电影网站| 欧美日本一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 欧美大胆人体bbbb| 成人av在线观| 亚洲图片欧美色图| 欧美成人激情免费网| 东方aⅴ免费观看久久av| 中文字幕在线播放不卡一区| 91豆麻精品91久久久久久| 日韩高清在线不卡| 久久精品视频一区二区| 99精品偷自拍| 蜜桃视频第一区免费观看| 中文字幕乱码一区二区免费| 色婷婷国产精品| 精品一区二区日韩| 亚洲美女屁股眼交| 久久美女高清视频| 欧美视频在线一区| 福利一区二区在线观看| 亚洲成人黄色小说| 国产亚洲婷婷免费| 精品视频一区二区三区免费| 国产永久精品大片wwwapp| 亚洲激情图片小说视频| 亚洲精品一区二区三区福利 | 日韩欧美一二三区| 91在线视频播放地址| 免费观看久久久4p| 亚洲一区视频在线| 欧美韩国日本不卡| 日韩欧美一级二级三级久久久| 91首页免费视频| 国产精品亚洲综合一区在线观看| 亚洲午夜精品17c| 国产精品美日韩| 久久久久久久久久久电影| 9191久久久久久久久久久| 成人av午夜电影| 国产精品一区二区男女羞羞无遮挡| 亚洲aⅴ怡春院| 亚洲免费观看视频| 国产精品私房写真福利视频| 精品日韩一区二区三区 | 午夜精品久久久久久久99水蜜桃| 久久蜜桃av一区精品变态类天堂| 51精品视频一区二区三区| 在线观看免费亚洲| 91网站在线播放| 成人晚上爱看视频| 国产成人免费网站| 国产麻豆精品95视频| 久久99热狠狠色一区二区| 亚洲综合色区另类av| 亚洲老司机在线| 亚洲美女区一区| 亚洲精选视频免费看| 国产欧美综合在线| 久久久99精品免费观看| 久久亚洲精品小早川怜子| 久久久久久久久久看片| 久久综合久久99| 国产午夜精品一区二区三区视频 | 日韩欧美国产系列|