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;">

                    99久久精品国产一区二区三区| 精品国偷自产国产一区| 国产精品三级av| 国产精一区二区三区| 国产精品国产三级国产有无不卡 | 精品国产免费久久| 色域天天综合网| 国产高清视频一区| 九九九精品视频| 日韩激情av在线| 亚洲精品免费一二三区| 国产精品久久夜| 久久九九99视频| 久久久一区二区三区| 欧美大肚乱孕交hd孕妇| 欧美精品成人一区二区三区四区| 亚洲国产一区二区三区 | 久久久综合激的五月天| 91蜜桃在线免费视频| 国产成人av电影在线观看| 麻豆精品视频在线观看免费| 天堂成人免费av电影一区| 亚洲成在人线在线播放| 亚洲小说春色综合另类电影| 亚洲黄色小视频| 久久久久久久综合狠狠综合| 亚洲精品一线二线三线| 2020日本不卡一区二区视频| 欧美精品一区二区精品网| 精品久久久久久久久久久久久久久久久| 欧美日韩精品系列| 91精品国产综合久久久久久久 | 一区二区在线观看视频| 亚洲欧洲日产国码二区| 亚洲欧美偷拍另类a∨色屁股| 中文字幕在线观看一区| 国产精品免费看片| 亚洲一区二区中文在线| 天天操天天干天天综合网| 午夜电影网一区| 精品一区精品二区高清| 国产精品一二三四区| 91天堂素人约啪| 色999日韩国产欧美一区二区| 色综合网色综合| bt7086福利一区国产| 在线精品国精品国产尤物884a| 欧美日韩1234| 欧美日韩不卡在线| 久久综合精品国产一区二区三区 | 自拍偷拍国产亚洲| 蜜桃视频一区二区三区在线观看| 成人av网站在线观看| 欧美一级午夜免费电影| 日韩一区有码在线| 国产乱理伦片在线观看夜一区| 欧洲av在线精品| 中文av字幕一区| 狠狠色综合日日| 91精品国产综合久久久久久久久久 | 国产精品乱码久久久久久| 天天操天天色综合| 日本精品免费观看高清观看| 国产农村妇女毛片精品久久麻豆| 日本aⅴ精品一区二区三区| 欧美性大战久久| 亚洲免费大片在线观看| 国产a精品视频| 久久影院电视剧免费观看| 日韩国产成人精品| 欧美嫩在线观看| 日韩中文字幕区一区有砖一区| 91天堂素人约啪| 亚洲精品免费在线播放| 91美女福利视频| 亚洲精选在线视频| 色噜噜狠狠成人中文综合| 亚洲欧美日韩成人高清在线一区| 国产精品一区二区久激情瑜伽| 欧美成人乱码一区二区三区| 欧美a级一区二区| 日韩欧美国产精品一区| 美腿丝袜一区二区三区| 日韩一区二区三区三四区视频在线观看| 伊人一区二区三区| 色欧美乱欧美15图片| 亚洲精品国产无套在线观| 91天堂素人约啪| 亚洲一区二区偷拍精品| 欧美性生活大片视频| 天堂va蜜桃一区二区三区漫画版| 欧美精品久久久久久久久老牛影院 | 亚洲第一成人在线| 911国产精品| 久久99国产精品久久| 久久精品视频在线看| 懂色一区二区三区免费观看| 成人欧美一区二区三区白人| 91福利在线导航| 日韩黄色免费电影| 久久嫩草精品久久久久| 成人午夜视频在线观看| 一二三区精品视频| 欧美一区二区三区精品| 国产麻豆视频精品| 亚洲三级免费观看| 欧美一区二区三区免费大片| 高清不卡一区二区| 偷窥少妇高潮呻吟av久久免费| 这里是久久伊人| 老司机一区二区| 成人亚洲一区二区一| 国产精品美女久久久久久2018| 亚洲高清免费观看 | 欧美一区二区三区四区高清| 1区2区3区欧美| 国产精品一级二级三级| 日韩一级大片在线| 欧美aa在线视频| 欧美mv日韩mv亚洲| 日本不卡在线视频| 欧美日韩国产成人在线91| 午夜国产精品影院在线观看| 色94色欧美sute亚洲线路二| 亚洲欧美一区二区三区国产精品 | 在线亚洲一区二区| 一区二区三区毛片| 欧洲日韩一区二区三区| 亚洲福利视频一区二区| 欧美男人的天堂一二区| 久久91精品国产91久久小草| 欧美r级电影在线观看| 成人免费毛片aaaaa**| 1024成人网色www| 91一区二区三区在线播放| 亚洲一区日韩精品中文字幕| 在线观看91av| 国产成人在线视频免费播放| 亚洲精品日产精品乱码不卡| 日韩一区二区在线看| 成人污污视频在线观看| 天天av天天翘天天综合网| 2024国产精品视频| 91精彩视频在线| 国产 日韩 欧美大片| 奇米888四色在线精品| 中文字幕永久在线不卡| 欧美一区二区久久久| 91日韩一区二区三区| 成人黄色在线网站| 美女爽到高潮91| 亚洲国产精品尤物yw在线观看| 日韩久久久精品| 日韩欧美国产wwwww| 欧美性色综合网| 日本国产一区二区| 成人午夜av在线| 成年人午夜久久久| 成人午夜精品一区二区三区| 国产成人在线看| 成人看片黄a免费看在线| 国内精品第一页| 成人av电影在线播放| 高清不卡在线观看av| 成人免费高清在线观看| 波多野结衣视频一区| 成人午夜激情在线| 色综合久久综合中文综合网| 91在线视频网址| 欧美日韩亚州综合| 欧美日韩国产成人在线91| 日韩视频在线一区二区| 精品国产百合女同互慰| 久久精品人人做人人爽人人| 国产精品美女久久久久久2018| 国产精品不卡一区二区三区| 亚洲一区二区av电影| 另类欧美日韩国产在线| 成人黄色大片在线观看| 欧日韩精品视频| 久久综合中文字幕| 亚洲综合一二三区| 国模少妇一区二区三区| 91污片在线观看| 日韩久久久久久| 亚洲成人av中文| 高清日韩电视剧大全免费| 欧美一区二区在线观看| 国产精品乱码久久久久久| 视频在线在亚洲| 色天使久久综合网天天| www国产成人| 青青草91视频| 91精品国产乱码久久蜜臀| 亚洲激情六月丁香| 成人黄色片在线观看| 国产精品免费丝袜| 国产99精品在线观看| 国产午夜精品在线观看| 国产宾馆实践打屁股91|