Java的新项目学成在线笔记-day18(十)

 微服务之间认证 4.1 需求分析 
前边章节已经实现了用户携带身份令牌和JWT令牌访问微服务,微服务获取jwt并完成授权。 当微服务访问微服务,此时如果没有携带JWT则微服务会在授权时报错。
测试课程预览:
1、将课程管理服务和CMS全部添加授权配置 
2、用户登录教学管理前端,进入课程发布界面,点击课程发布,观察课程管理服务端报错如下:

[AppleScript] 纯文本查看 复制代码

?

1

2

feign.FeignException: status 401 reading CmsPageClient#save(CmsPage); content:   {"error":"unauthorized","error_description":"Full authentication is required to access this

 resource"}


分析原因:
由于课程管理访问CMS时没有携带JWT令牌导致。
解决方案:
微服务之间进行调用时需携带JWT。   4.2 Feign 拦截器 
4.2.1 定义Feign拦截器 
微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT。 在common工程添加依赖:
 

[AppleScript] 纯文本查看 复制代码

?

1

2

3

4

<dependency>  

  <groupId>org.springframework.cloud</groupId>  

  <artifactId>spring‐cloud‐starter‐openfeign</artifactId>

 </dependency>


在Common工程定义拦截器如下:
 

[AppleScript] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

package com.xuecheng.framework.interceptor; 

 public class FeignClientInterceptor implements RequestInterceptor {  

  @Override  

  public void apply(RequestTemplate requestTemplate) {   

       try {        

    //使用RequestContextHolder工具获取request相关变量      

      ServletRequestAttributes attributes = (ServletRequestAttributes)

  RequestContextHolder.getRequestAttributes();   

         if(attributes!=null){          

      //取出request     

           HttpServletRequest request = attributes.getRequest();       

         Enumeration<String> headerNames = request.getHeaderNames();       

         if (headerNames != null) {          

          while (headerNames.hasMoreElements()) {    

                    String name = headerNames.nextElement();          

              String values = request.getHeader(name);            

            if(name.equals("authorization")){              

              //System.out.println("name="+name+"values="+values);           

                 requestTemplate.header(name, values);   

                     }                

      }       

         }      

      }      

    }catch (Exception e) {   

         e.printStackTrace();    

    } 

   } }


4.2.2  使用Feign拦截器 
本例子中课程管理调用cms需要携带jwt,所以需要在课程管理中定义Feign拦截器bean,在启动类中定义bean如 下:
 

[AppleScript] 纯文本查看 复制代码

?

1

@Bean  public FeignClientInterceptor feignClientInterceptor(){      return new FeignClientInterceptor()}


4.2.3 测试 
执行课程发布,提示发布成功。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值