欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot如何完美通過token獲取用戶信息

 更新時間:2023年12月06日 10:37:59   作者:只會寫bug的靚仔  
這篇文章主要給大家介紹了關于springboot如何完美通過token獲取用戶信息的相關資料, Token是在服務端產(chǎn)生的,如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會返回Token給前端,需要的朋友可以參考下

1. 什么是Token?

身份驗證令牌(Authentication Token):在身份驗證過程中,“token”
可以表示一個包含用戶身份信息的令牌。

例如

Token(JWT)是一種常見的身份驗證令牌,它包含用戶的身份信息(例如用戶名或用戶ID)以及其他相關信息,如權限或過期時間。無意義令牌token,這種一般在獲取后通過nosql查詢token對應的用戶信息。

當然,設計token網(wǎng)上大多有現(xiàn)成的解決方案,但是通過token如何拿個人信息呢?

2. 如何優(yōu)雅的獲取用戶信息?

雖然token是用戶憑證,但是在后端中,token是不能直接和數(shù)據(jù)進行交互的,我們需要轉換成token用戶信息。

解決思路:

我們大多會在過濾器filter進行token檢驗,在這里我們已經(jīng)已經(jīng)從header中解析并且驗證了token了。如果我們要是再在Controller中獲取header,在解決,感覺一點也不優(yōu)雅。

我們的兩種解決方案:

通過header進行解析(推薦):

哈哈哈,沒想到我們還是從這種low的方法里弄的吧。 實際上nosql性能很不錯,再查一次也無傷大雅,并且這種方式耦合度較低,符合代碼規(guī)范。

我們可以通過注解的方式,可以盡量美觀很多

1.1. 創(chuàng)建CurrentUserUuid接口

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserUuid {
}

1.2. 創(chuàng)建oginUserHandlerMethodArgumentResolver解析器

@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Resource
    private TokenUtil tokenUtil;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUserUuid.class) &&
                parameter.getParameterType().isAssignableFrom(String.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) {
        // header中獲取用戶token
        String token = request.getHeader("Authorization");
        // TODO 根據(jù)userId獲取User信息,這里省略,直接創(chuàng)建一個User對象。
        return tokenUtil.getUserToken(token);
    }
}

過濾器二次封裝請求體

我們可以在第一次過濾器查的時候,把對應的信息封裝到請求中,但是請求多變,get,post參數(shù)一般在不同的位置上,需要寫更復雜的結構

@Override	
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)	
            throws IOException, ServletException {	
    HttpServletRequest httpRequest = (HttpServletRequest) request;	
    HttpServletResponse httpResponse = (HttpServletResponse) response;	
    String token = request.getHeader("token");	
    JWTResult result = JWTUtils.checkToken(token);	
    Long userId = result.getUserId();	
    HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {	
            @Override	
            public String[] getParameterValues(String name) {	
                if (name.equals("loginUserId")) {	
                    return new String[] { userId .toString() };	
                }	
                return super.getParameterValues(name);	
            }	
            @Override	
            public Enumeration<String> getParameterNames() {	
                Set<String> paramNames = new LinkedHashSet<>();	
                paramNames.add("loginUserId");	
                Enumeration<String> names =  super.getParameterNames();	
                while(names.hasMoreElements()) {	
                    paramNames.add(names.nextElement());	
                }	
                return Collections.enumeration(paramNames);	
            }	
    };	
    chain.doFilter(requestWrapper, httpResponse);	
}

這種好處是只需要查一次,但是請求參數(shù)多變,需要寫很多額外的解構去處理,并且增加了耦合度

3. 總結

我還是推薦方法1,無疑,雖然多查一次,但是結構簡單,耦合度低,并且代碼較為簡潔。

到此這篇關于springboot如何完美通過token獲取用戶信息的文章就介紹到這了,更多相關springboot token獲取用戶信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論