実際のプロジェクトでは、私たちが発行される傾向がありtoken
、フロントエンドに証明書を、すべての要求でリクエストパラメータやリクエストヘッダにより、フロントエンドにはなりますtoken
バックエンドの検証に渡されます。後端が得られtoken
た後に、検証されtoken
、例えば、実際のニーズのパラメータに変換しますuserId
。
ではSrpingBoot
プロジェクト、無リクエストパラメータので、userId
このパラメータを、私たちは、プロセスによって、基準形状を得ることができないuserId
、我々は必要とHttpServletWrapper
されるtoken
に変換userId
パラメータ。
1、継承HttpServletWrapperクラスとオーバーライドメソッドgetParameterValues
注意:実際のここでの使用していない
token
が、とmap
アナログtoken
ストレージtoken
の123
と456
有効な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、インタフェース要求はへのアクセス
- 何のときに
token
パラメータまたはtoken
パラメータが無効ではない、不正な情報を返します。
- とき
token
のパラメータが有効で、対応を取得しますuserId