zoukankan      html  css  js  c++  java
  • zuul作为网关充当过滤器

    一,zuul作为过滤器实现身份校验

    网关连接redis校验令牌

     2 
     3 import com.alibaba.fastjson.JSON;
     4 import com.netflix.zuul.ZuulFilter;
     5 import com.netflix.zuul.context.RequestContext;
     6 import com.netflix.zuul.exception.ZuulException;
     7 
     8 import com.xuecheng.filesystem.framework.model.response.CommonCode;
     9 import com.xuecheng.filesystem.framework.model.response.ResponseResult;
    10 import com.xuecheng.govern.gateway.service.LoginService;
    11 import org.springframework.beans.factory.annotation.Autowired;
    12 import org.springframework.stereotype.Component;
    13 import org.springframework.util.StringUtils;
    14 
    15 import javax.servlet.http.HttpServletRequest;
    16 
    17 @Component
    18 public class LoginFilter extends ZuulFilter {
    19 
    20     @Autowired
    21     private LoginService loginService;
    22 
    23     @Override
    24     public String filterType() {
    25         return "pre";
    26     }
    27 
    28     @Override
    29     public int filterOrder() {
    30         return 0;
    31     }
    32 
    33     @Override
    34     public boolean shouldFilter() {
    35         return true;
    36     }
    37     
    38     /**
    39      * 验证登录信息
    40      * @return
    41      * @throws ZuulException
    42      */
    43     @Override
    44     public Object run() throws ZuulException {
    45 
    46         RequestContext requestContext = RequestContext.getCurrentContext();
    47         HttpServletRequest request = requestContext.getRequest();
    48 
    49         //1. 判断cookie中jti是否存在
    50         String jti = loginService.getJtiFromCookie(request);
    51         if (StringUtils.isEmpty(jti)){
    52             //拒绝访问
    53             this.accessRefused();
    54         }
    55 
    56 
    57         //2. 判断redis中的token是否过期
    58         boolean result = loginService.getTokenFromRedis(jti);
    59         if (!result){
    60             //过期
    61             this.accessRefused();
    62         }
    63 
    64         //3. 判断header中是否存在Authorization
    65         String headerValue=loginService.getHeaderInfo(request);
    66         if (StringUtils.isEmpty(headerValue)){
    67             this.accessRefused();
    68         }
    69 
    70         return null;
    71     }
    72 
    73     private void accessRefused() {
    74 
    75         RequestContext requestContext = RequestContext.getCurrentContext();
    76         //设置拒绝访问
    77         requestContext.setSendZuulResponse(false);
    78         //设置响应码
    79         requestContext.setResponseStatusCode(200);
    80         //设置contenttype
    81         requestContext.getResponse().setContentType("application/json;charset=utf-8");
    82         //设置响应内容
    83         ResponseResult responseResult = new ResponseResult(CommonCode.UNAUTHENTICATED);
    84         String jsonString = JSON.toJSONString(responseResult);
    85 
    86         requestContext.setResponseBody(jsonString);
    87     }
    88 }

    service

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;
    
    @Service
    public class LoginService {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        /**
         * 从cookie中获取数据
         * @param request
         * @return
         */
        public String getJtiFromCookie(HttpServletRequest request) {
    
            Map<String, String> map = CookieUtil.readCookie(request, "uid");
            String jti = map.get("uid");
            return jti;
        }
    
        /**
         * 从redis中获取令牌信息是否过期
         * @param jti
         * @return
         */
        public boolean getTokenFromRedis(String jti) {
            String key = "user_token:"+jti;
            Long expire = stringRedisTemplate.getExpire(key);
            return expire>0;
        }
    
        /**
         * 从header中获取数据
         * @param request
         * @return
         */
        public String getHeaderInfo(HttpServletRequest request) {
            String headerValue = request.getHeader("Authorization");
            if (StringUtils.isEmpty(headerValue)){
                return null;
            }
            if (!headerValue.startsWith("Bearer ")){
                return null;
            }
    
            return headerValue;
        }
    }

    实现功能

    出现的问题:客户端不同,cookie不同

    postman

    和浏览器保存的令牌不同

    当一个男人不再对你啰嗦,不再缠着你,不再没事找你,对你说话也客气了,也不再气你了。那么恭喜你,你已经成功的失去了他。别嫌弃男人幼稚,那是他喜欢你,爱你。女人说男人像小孩子一样不成熟,可又有谁知道,男人在自己喜欢的女人面前才像小孩子,如果不喜欢你了,不爱你了,他比你爸还成熟。
  • 相关阅读:
    【华为云技术分享】区块链与数据库如何结合?
    【华为云技术分享】跟繁琐的命令行说拜拜!Gerapy分布式爬虫管理框架来袭!
    gin casbin xorm vue-admin权限认证。
    golang优秀库及介绍
    网上的element-ui-admin运行
    golang时区处理
    Let's Encrypt apache的配置
    wireshark分析自己向自己请求服务
    XORM的几个常用数据处理
    golang处理json
  • 原文地址:https://www.cnblogs.com/fengtangjiang/p/11147858.html
Copyright © 2011-2022 走看看