11111111111
知識(shí)共享平臺(tái)
知識(shí)共享平臺(tái)

討教大學(xué)平臺(tái)

  • 首頁(yè)
  • 免費(fèi)課
  • 精品課
  • 討教題庫(kù)
  • 企業(yè)服務(wù)

    hot

  • 下載APP
  • 證書(shū)查詢
  • 關(guān)于我們
我問(wèn)
討教號(hào)
搜索
消息
  • 我的文章

    我的關(guān)注

    我的問(wèn)答

    我的秘密

    我的評(píng)論

    我的訂閱

    我的打賞

    我的錢(qián)包

    我的通知

    我的設(shè)置

    退出登錄

  • ×

    登錄

    討教 | 通行證

    登錄
    立即注冊(cè)
    忘記密碼?
    使用微信登錄

    提問(wèn) ×

    寫(xiě)下你的問(wèn)題,準(zhǔn)確的表述更容易得到答案

    類型話題

    選擇支付方式
    您的討教幣 111 付費(fèi)金額

        1. <s id="iy6ai"><samp id="iy6ai"></samp></s>
            • <abbr id="iy6ai"></abbr>
                  <abbr id="iy6ai"><code id="iy6ai"></code></abbr>
                  <s id="iy6ai"><tbody id="iy6ai"></tbody></s>
                  <button id="iy6ai"></button>

                  Token認(rèn)證,如何快速方便獲取用戶信息 尹吉?dú)g JAVA葵花寶典 今天

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

                  背景

                  我們有一個(gè)Web項(xiàng)目,這個(gè)項(xiàng)目提供了很多的Rest API。也做了權(quán)限控制,訪問(wèn)API的請(qǐng)求必須要帶上事先認(rèn)證后獲取的Token才可以。

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

                  方式一(很挫)

                  我們?cè)贔ilter中進(jìn)行了統(tǒng)一攔截,在Controller中獲取用戶ID的話,仍然可以再次解析一遍T(mén)oken獲取用戶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. }

                  方式二(優(yōu)雅)

                  方式一需要重新解析一遍T(mén)oken, 浪費(fèi)資源。我們可以直接將Filter中解析好了的用戶ID直接通過(guò)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. }

                  方式三(很優(yōu)雅)

                  通過(guò)Header傳遞確實(shí)很方便,但如果你有代碼潔癖的話總會(huì)覺(jué)得怪怪的,能不能不用Header方式,比如說(shuō)我就在方法上定義一個(gè)loginUserId的參數(shù),你給我直接注入進(jìn)來(lái),這個(gè)有點(diǎn)意思哈,下面我們來(lái)實(shí)現(xiàn)下:

                  GET參數(shù)方式

                  在Filter中追加參數(shù):

                  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. }

                  接口中直接填寫(xiě)參數(shù)即可獲取:

                  1. @GetMapping("/hello")

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

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

                  4. }

                  對(duì)于post請(qǐng)求,也可以用這種方式:

                  1. @PostMapping("/hello")

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


                  3. }

                  可是往往我們?cè)谟胮ost請(qǐng)求的時(shí)候,要么就是表單提交,要么就是json體的方式提交,一般不會(huì)使用get方式參數(shù),這也就意味著這個(gè)loginUserId我們需要注入到對(duì)象中:

                  先創(chuàng)建一個(gè)參數(shù)實(shí)體類:

                  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測(cè)試一下,表單方式是直接支持的:再次試下Json提交方式:

                  1. @PostMapping("/hello")

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

                  3. return user;

                  4. }

                  看下圖,失敗了,得重新想辦法實(shí)現(xiàn)下只需要在HttpServletRequestWrapper中重新對(duì)提交的內(nèi)容進(jìn)行修改即可:

                  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直接注入到參數(shù)中了,不用去Header中獲取,是不是很方便。

                  本網(wǎng)站內(nèi)容僅代表作者本人的觀點(diǎn),不代表本網(wǎng)站的觀點(diǎn)和看法,與本網(wǎng)站立場(chǎng)無(wú)關(guān),如有侵權(quán)請(qǐng)聯(lián)系討教。
                  給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作
                  0人打賞金額
                  JAVA葵花寶典
                  16篇 作品
                  2208 總閱讀量
                  評(píng)論
                  您可能感興趣的文章

                  項(xiàng)目管理服務(wù)模式

                  敏捷項(xiàng)目管理與傳統(tǒng)項(xiàng)目管理比較

                  項(xiàng)目管理的特點(diǎn)

                  PMO是什么?是管項(xiàng)目經(jīng)理的嘛?

                  項(xiàng)目經(jīng)理必須關(guān)注的開(kāi)會(huì)十大關(guān)鍵問(wèn)題!

                  項(xiàng)目的組成要素

                  熱門(mén)話題 更多話題
                  精益生產(chǎn) 質(zhì)量管理 智能制造
                  職場(chǎng)效率 項(xiàng)目管理 討教
                  AI 大數(shù)據(jù) 六西格瑪
                  ×

                  給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作!

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

                  微信掃描支付

                  打賞金額: 1元

                  ×

                  給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作!

                  您的討教幣
                  填寫(xiě)您打賞討教幣數(shù)量
                  輸入密碼

                  111

                  注:打賞的收益歸作者,非平臺(tái)

                  微信掃描支付

                  打賞金額: 1元

                  感谢您访问我们的网站,您可能还对以下资源感兴趣:

                  国产精品久久久久久久人人看
                  主站蜘蛛池模板: 韩国理伦片一区二区三区在线播放| 无码中文字幕人妻在线一区二区三区| 无码精品一区二区三区在线| 国产未成女一区二区三区| 美女视频一区二区| 99久久无码一区人妻a黑| 国产亚洲3p无码一区二区| 四虎永久在线精品免费一区二区 | 亚洲一区精彩视频| 国产精品特级毛片一区二区三区 | 亚洲av乱码中文一区二区三区| 中文字幕国产一区| 国产成人一区二区动漫精品| 亚洲日韩国产欧美一区二区三区 | 波多野结衣一区二区三区高清av | 国产精品亚洲午夜一区二区三区 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲AV无码一区二三区| 国产免费av一区二区三区| 无码一区二区三区免费视频| 午夜性色一区二区三区免费不卡视频| 国偷自产av一区二区三区| 中文字幕一区二区三区5566 | 中文字幕av无码一区二区三区电影| 日韩AV片无码一区二区不卡 | 国产视频一区二区| 国产精品久久久久一区二区三区| 国模吧一区二区三区精品视频| 国产一区二区影院| 亚洲午夜日韩高清一区| 一区二区三区91| 精品一区二区久久久久久久网站| 伊人色综合视频一区二区三区| 亚洲熟妇av一区| 国产福利一区二区三区在线观看| 精品一区二区三区四区在线播放| 亚洲Av无码一区二区二三区| 国产精品视频一区| 麻豆精品一区二区综合av| 国产综合无码一区二区三区| 日韩一区精品视频一区二区|
                • <code id="aae4u"><source id="aae4u"></source></code>
                  • <bdo id="aae4u"><dd id="aae4u"></dd></bdo>
                    • <li id="aae4u"></li>
                        <table id="aae4u"><source id="aae4u"></source></table>
                        • <s id="aae4u"><tbody id="aae4u"></tbody></s>