JAvaフィルタグローバル解析token

17984 ワード

JAvaフィルタグローバル解析token
文書ディレクトリ
  • javaフィルタグローバル解析token
  • フィルタを使用してグローバルtoken解析器
  • を定義する
  • 一般インタフェース定義
  • グローバルAOP解析
  • インタフェース注釈@RequestHeader
  • を使用
  • 私のニーズと方法
  • 需要と現状
  • 実践
  • 注意点
  • フィルタを使用してグローバルtoken解析器を定義する
    バックエンドインタフェースの開発を行う過程で、一般的に人員ユーザーに関連し、権限や安全面の考慮インタフェースはtokenを使用してユーザーやいくつかの安全係数の高い認証パラメータなどを伝達する.
    一般インタフェース定義
    グローバルAOP解析
    AOPを使用して、token情報を取得する必要があるインタフェースに対して、メソッドの強化を行い、controllerに入る前に、インタフェースメソッドの認証を動的に行うか、インタフェースメソッドにtoken関連のパラメータを追加します.必要に応じて必要なパラメータも異なり、これはビジネスに基づいて行うことができ、この方面のコードも多く、原理は方法の実行前にtoken認証を行い、あるいはパラメータの追加や抽出を行うことである.業務が複雑であれば、自分で想像して、自分でやることができます.
    インタフェース注記@RequestHeaderの使用
    もう1つの方法は,各インタフェースがtokenの認証やパラメータ抽出を自分で処理し,要求パラメータにヘッダから取得した値を宣言し,メソッド内部で解析することである.
    
    @GetMapping("legend")
    public Response getTheShy(@RequestHeader String token, @RequestParam() String top){
        //  token  。。
        //  
    	return null;
    }
    
    

    面倒を恐れない場合や、わずかなインタフェースだけがtokenを必要とする方法を考えることができます.マイクロサービスにとって、tokenの認証は単独のサービスかもしれません.あるいは、他の方法を呼び出して、この方法をカプセル化する必要がありますが、実はまあまあです.
    私のニーズと方法
    需要と現状
  • トラフィックのほとんどの外部インタフェースは、ユーザIDまたはユーザ名
  • のようなユーザの情報を必要とする.
  • tokenの解析と配布の業務は私のモジュールではなく、私が得たtokenはゲートウェイからバックグラウンドプログラムに配布されたtokenであり、解析はゲートウェイに依存するサービス
  • を必要とする
  • token解析したユーザーの情報
  • だけが必要です
  • 各インタフェースがtokenがどのように解析されたのか、どのようにパラメータを取得したのかに関心を持ちたくない
  • じっこう
    フィルタを使用して要求パラメータの取得を制御し、要求パラメータの値を制御します.
  • 制御層コード具体コード:controller:
  •     @GetMapping("top")
        public Response  getTheShy(String token){
       
          log.info(token);    
          return topService.getTheShy(token);
        }
    

    制御層インタフェースで必要なユーザー情報、すなわちtokenから解析するデータを直接宣言します.
  • フィルタコード
  • 具体的なコード:
    @Component
    @WebFilter(filterName="token",urlPatterns= {"/*"})
    public class FilterConfigController implements Filter {
    
    
        private static Logger log = LoggerFactory.getLogger(FilterConfigController.class);
    
        @Override
        public void init(FilterConfig filterConfig) {
            log.info("      ");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) servletRequest){
    
                @Override
                public Map<String, String[]> getParameterMap() {
                    return super.getParameterMap();
                }
    
                @Override
                public String getParameter(String name) {
                    return super.getParameter(name);
                }
    
                @Override
                public String[] getParameterValues(String name) {
                    if("token".equals(name) || "userId".equals(name)){
                        String token = this.getHeader("Token");
                        //      token
                        if (StringUtils.isEmpty(token)){
                            log.error("  token");
                            throw new MyRuntimeException(ErrorCode.ERROR_AUTH_NULL_TOKEN);
                        }
                        if ("token".equals(name)){
                            //     token  
                        }else if ("userId".equals(name)){
                            //     token  
                        }
                        
                        return new String[]{token};
                    }
                    return super.getParameterValues(name);
                }
    
                @Override
                public String getQueryString() {
                    return super.getQueryString();
                }
            };
            filterChain.doFilter(requestWrapper,servletResponse);
    
        }
    
    
    }
    
  • はFilterを継承し、主にdoFilterメソッドのgetParameterValueメソッドに対して
  • を書き換える方法を実現する.
  • この方法の役割は、controllerがパラメータ値を必要とする場合、ここから取得するので、カスタムパラメータを取得することができます.
  • は、取得するパラメータ名をtokenと呼び、ここでこのパラメータ名をブロックし、指定したパラメータ名の値を取得する必要がある場合、次のコードによって
  • を生成することを規定している.
  • の次のコードは、要求ヘッダからtokenを取得し、ユーザ情報を認証して取得する具体的な実装
  • である.
  • リクエストヘッダのtokenが私たちのニーズを満たしていないか、解析に失敗した場合、controller 6に入ることなくフロントエンドに直接戻ることができます.私が採用した直接フロントエンドに戻る方法は、フィルタにカスタムの実行時異常を直接投げ出すことです(この方法では異常は許可されず、実行時異常を投げ出すしかありません)
  • .
  • は、投げ出すカスタムランタイム異常をグローバルな異常処理によって処理し、フロントエンド
  • に戻る.
    
    /**
         *        
         * @param e
         * @return
         */
        @ExceptionHandler
        public Response runtimeExceptionMatchHandle(RuntimeException e, HttpServletResponse response){
    
            if (e instanceof MyRuntimeException){
                e.printStackTrace();
                return Response.failure(((MyRuntimeException) e).getCode());
            }
            return Response.failure(ErrorCode.ERROR);
        }
    

    カスタム例外は、投げ出すときに返される情報も返されます.
    
    /**
     *         
     */
    public class MyRuntimeException extends RuntimeException{
    
        private ErrorCode code;
        public MyRuntimeException(ErrorCode code){
            super(code.getMsg());
            this.code = code;
        }
    
        public ErrorCode getCode() {
            return code;
        }
    }
    

    注意点
  • controllerのパラメータに@RequestParam注記を付けると、このパラメータ値を取得するときにフィルタのメソッドには入らない
  • カスタムフィルタに入る必要のない他のパラメータに注釈を付けてもよいし、付けなくてもよいし、名前が異なる限り
  • を下に進まない.
  • 取得するtoken関連パラメータに、この注記
  • を付けないでください.
  • カスタムフィルタは、複数のパラメータを取得できる入口で、1つのパラメータ名を追加して判断し、パラメータ値を返す場合、名前によって異なる値を返すことができる
  • .
    もし問題があれば、指摘を歓迎します.分からないなら、ブロガーを私信してもいいです.