JAvaフィルタグローバル解析token
17984 ワード
JAvaフィルタグローバル解析token
文書ディレクトリ javaフィルタグローバル解析token フィルタを使用してグローバルtoken解析器 を定義する一般インタフェース定義 グローバルAOP解析 インタフェース注釈@RequestHeader を使用私のニーズと方法 需要と現状 実践 注意点 フィルタを使用してグローバルtoken解析器を定義する
バックエンドインタフェースの開発を行う過程で、一般的に人員ユーザーに関連し、権限や安全面の考慮インタフェースはtokenを使用してユーザーやいくつかの安全係数の高い認証パラメータなどを伝達する.
一般インタフェース定義
グローバルAOP解析
AOPを使用して、token情報を取得する必要があるインタフェースに対して、メソッドの強化を行い、controllerに入る前に、インタフェースメソッドの認証を動的に行うか、インタフェースメソッドにtoken関連のパラメータを追加します.必要に応じて必要なパラメータも異なり、これはビジネスに基づいて行うことができ、この方面のコードも多く、原理は方法の実行前にtoken認証を行い、あるいはパラメータの追加や抽出を行うことである.業務が複雑であれば、自分で想像して、自分でやることができます.
インタフェース注記@RequestHeaderの使用
もう1つの方法は,各インタフェースがtokenの認証やパラメータ抽出を自分で処理し,要求パラメータにヘッダから取得した値を宣言し,メソッド内部で解析することである.
面倒を恐れない場合や、わずかなインタフェースだけがtokenを必要とする方法を考えることができます.マイクロサービスにとって、tokenの認証は単独のサービスかもしれません.あるいは、他の方法を呼び出して、この方法をカプセル化する必要がありますが、実はまあまあです.
私のニーズと方法
需要と現状トラフィックのほとんどの外部インタフェースは、ユーザIDまたはユーザ名 のようなユーザの情報を必要とする. tokenの解析と配布の業務は私のモジュールではなく、私が得たtokenはゲートウェイからバックグラウンドプログラムに配布されたtokenであり、解析はゲートウェイに依存するサービス を必要とする token解析したユーザーの情報 だけが必要です各インタフェースがtokenがどのように解析されたのか、どのようにパラメータを取得したのかに関心を持ちたくない じっこう
フィルタを使用して要求パラメータの取得を制御し、要求パラメータの値を制御します.制御層コード具体コード:controller:
制御層インタフェースで必要なユーザー情報、すなわちtokenから解析するデータを直接宣言します.フィルタコード 具体的なコード:はFilterを継承し、主にdoFilterメソッドのgetParameterValueメソッドに対して を書き換える方法を実現する.この方法の役割は、controllerがパラメータ値を必要とする場合、ここから取得するので、カスタムパラメータを取得することができます. は、取得するパラメータ名をtokenと呼び、ここでこのパラメータ名をブロックし、指定したパラメータ名の値を取得する必要がある場合、次のコードによって を生成することを規定している.の次のコードは、要求ヘッダからtokenを取得し、ユーザ情報を認証して取得する具体的な実装 である.リクエストヘッダのtokenが私たちのニーズを満たしていないか、解析に失敗した場合、controller 6に入ることなくフロントエンドに直接戻ることができます.私が採用した直接フロントエンドに戻る方法は、フィルタにカスタムの実行時異常を直接投げ出すことです(この方法では異常は許可されず、実行時異常を投げ出すしかありません) .は、投げ出すカスタムランタイム異常をグローバルな異常処理によって処理し、フロントエンド に戻る.
カスタム例外は、投げ出すときに返される情報も返されます.
注意点 controllerのパラメータに@RequestParam注記を付けると、このパラメータ値を取得するときにフィルタのメソッドには入らない カスタムフィルタに入る必要のない他のパラメータに注釈を付けてもよいし、付けなくてもよいし、名前が異なる限り を下に進まない.取得するtoken関連パラメータに、この注記 を付けないでください.
カスタムフィルタは、複数のパラメータを取得できる入口で、1つのパラメータ名を追加して判断し、パラメータ値を返す場合、名前によって異なる値を返すことができる .
もし問題があれば、指摘を歓迎します.分からないなら、ブロガーを私信してもいいです.
文書ディレクトリ
バックエンドインタフェースの開発を行う過程で、一般的に人員ユーザーに関連し、権限や安全面の考慮インタフェースは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の認証は単独のサービスかもしれません.あるいは、他の方法を呼び出して、この方法をカプセル化する必要がありますが、実はまあまあです.
私のニーズと方法
需要と現状
フィルタを使用して要求パラメータの取得を制御し、要求パラメータの値を制御します.
@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);
}
}
/**
*
* @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;
}
}
注意点
もし問題があれば、指摘を歓迎します.分からないなら、ブロガーを私信してもいいです.