トークンパラメータのユーザーIDに正常に変換する方法

実際のプロジェクトでは、私たちが発行される傾向がありtoken、フロントエンドに証明書を、すべての要求でリクエストパラメータやリクエストヘッダにより、フロントエンドにはなりますtokenバックエンドの検証に渡されます。後端が得られtokenた後に、検証されtoken、例えば、実際のニーズのパラメータに変換しますuserId

ではSrpingBootプロジェクト、無リクエストパラメータので、userIdこのパラメータを、私たちは、プロセスによって、基準形状を得ることができないuserId、我々は必要とHttpServletWrapperされるtokenに変換userIdパラメータ。

1、継承HttpServletWrapperクラスとオーバーライドメソッドgetParameterValues

注意:実際のここでの使用していないtokenが、とmapアナログtokenストレージtoken123456有効なtoken対応、userId = 1およびuserId = 2

/**
* Token请求包装类,将token字段转换成userId字段
* @author yan
* @date 2019年10月17日
*/
public class TokenHttpServletWrapper extends HttpServletRequestWrapper{
   private Logger logger = LoggerFactory.getLogger(getClass());
   
   private Map<String,Integer> tokenMap;    //模拟token
   
   public TokenHttpServletWrapper(HttpServletRequest request) {
   	super(request);
   	tokenMap = new HashMap<>() {
   		{
   			put("123", 1);
   			put("456", 2);
   		}
   	};
   }


   @Override
   public String[] getParameterValues(String name) {
   	//如果请求参数不是userId,则跳过
   	if(!"userId".equals(name)) {
   		return super.getParameterValues(name);
   	}
   	//检验token,转换成相应的userId
   	String token = super.getParameter("token");
   	if(token == null) {
   		return null;
   	}
   	logger.debug("token:" + token);
   	Integer userId = tokenMap.get(token);
   	logger.debug("userId:" + userId);
   	return userId == null ? null : new String[] {String.valueOf(userId)};
   }
}
复制代码

図2は、定義されたフィルタは、それかどうかを決定するtokenパラメータまたはtokenパラメータが有効です

AbstractFilterカスタムフィルタは、他の用途のフィルタと一致し、主にネガティブパス機能を追加するために、抽象クラスであります

public class TokenFilter extends AbstractFilter{

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		String token = request.getParameter("token");
		if(!"123".equals(token) && !"456".equals(token)) {
			CodeResult codeResult = new CodeResult(CodeEnum.UNAUTHORIZED, null);
			response.setContentType("text/json;charset=utf-8");
			response.getWriter().write(BeanUtil.beanToJson(codeResult));
			return;
		}
		chain.doFilter(new TokenHttpServletWrapper(request), response);
	}
	
}
复制代码

図3に示すように、フィルタ構成

@Configuration
public class TokenFilterConfig {
	@Bean
	public FilterRegistrationBean<Filter> securityFilter() {
		FilterRegistrationBean registration = new FilterRegistrationBean();
		Filter filter = new TokenFilter();
		registration.setFilter(filter);
        registration.addUrlPatterns("/*");
        registration.setName("tokenFilter");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
	}
}
复制代码

4、Controller使用方法userIdのパラメータとして

5、インタフェース要求はへのアクセス

  1. 何のときにtokenパラメータまたはtokenパラメータが無効ではない、不正な情報を返します。

  1. ときtokenのパラメータが有効で、対応を取得しますuserId

おすすめ

転載: juejin.im/post/5db7b4fe51882540fd168c40