建站平臺(tái)入口關(guān)鍵詞排名優(yōu)化怎么樣
本文使用springcloud的gateway做token校驗(yàn)
登錄的本質(zhì):拿用戶名和密碼 換 token。
token會(huì)返回給瀏覽器(存儲(chǔ)),當(dāng)訪問的時(shí)候,攜帶token 發(fā)起請(qǐng)求。
- token校驗(yàn)圖
-
引入redis依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
-
token校驗(yàn)過濾器
package com.example.filter;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;/*** token 校驗(yàn)*/
@Component
public class TokenCheckFilter implements GlobalFilter, Ordered {//GlobalFilter全局過濾器,Ordered 順序優(yōu)先級(jí)@Autowiredprivate StringRedisTemplate redisTemplate; //引入redis依賴,才能使用/*** 指定好放行的路徑 (可以寫在這,也可以寫到配置文件中)* 白名單 (請(qǐng)求路徑)*/public static final List<String> ALLOW_URL = Arrays.asList("login-service/doLogin","/myUrl");/***前提是? 和前端約定好,一般放在請(qǐng)求頭中 key=Authorization, value=bearer token (前綴:bearer+空格+token)* 1.拿到url (GlobalFilter是全局過濾器, 但是,登錄 沒有token,要放行)* 2.判斷放行 (登錄+白名單 放行,不需要token)* 然后再校驗(yàn)token* 3.拿到 請(qǐng)求頭* 4.拿到token* 5.校驗(yàn) (看redis 中 有沒有,如果沒有就攔截,有就放行)* 6.放行/攔截** @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//拿到url 請(qǐng)求路徑ServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();if (ALLOW_URL.contains(path)){//放行return chain.filter(exchange);}//校驗(yàn)HttpHeaders headers = request.getHeaders(); //拿到請(qǐng)求頭List<String> authorization = headers.get("Authorization");if (!CollectionUtils.isEmpty(authorization)){ //key不為空,取第一個(gè)String token = authorization.get(0);if (StringUtils.hasText(token)){ //token不空//約定好有前綴 bearer tokenString realToken = token.replaceFirst("bearer ", "");// replaceFirst替換字符串前面if (StringUtils.hasText(realToken) && redisTemplate.hasKey(realToken)){//如果 請(qǐng)求頭中 有token, 并且 redis中 有這個(gè)token(不帶前綴)//放行return chain.filter(exchange);}}}//攔截ServerHttpResponse response = exchange.getResponse();response.getHeaders().set("content-type","application/json;charset=utf-8");HashMap<String, Object> map = new HashMap<>(4);//返回401map.put("code", HttpStatus.UNAUTHORIZED.value());map.put("msg","未授權(quán)");ObjectMapper objectMapper = new ObjectMapper();byte[] bytes = new byte[0]; //以字節(jié)形式 寫到objectmappertry {bytes = objectMapper.writeValueAsBytes(map);} catch (JsonProcessingException e) {throw new RuntimeException(e);}DataBuffer wrap = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(wrap));}@Overridepublic int getOrder() {return 2; //先校驗(yàn)ip,再校驗(yàn)token}
}
-
流程:
前提: 和前端約定好
token一般放在請(qǐng)求頭中 key=Authorization, value=bearer token
(前綴:bearer+空格+token)- 1.拿到url (GlobalFilter是全局過濾器, 但是,登錄 沒有token,要放行)
- 2.判斷放行 (登錄+白名單 放行,不需要token)
- 然后再校驗(yàn)token
- 3.拿到 請(qǐng)求頭
- 4.拿到token
- 5.校驗(yàn) (看redis 中 有沒有,如果沒有就攔截,有就放行)
- 6.放行/攔截