亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot如何完美通過(guò)token獲取用戶信息

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

1. 什么是Token?

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

例如

Token(JWT)是一種常見(jiàn)的身份驗(yàn)證令牌,它包含用戶的身份信息(例如用戶名或用戶ID)以及其他相關(guān)信息,如權(quán)限或過(guò)期時(shí)間。無(wú)意義令牌token,這種一般在獲取后通過(guò)nosql查詢token對(duì)應(yīng)的用戶信息。

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

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

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

解決思路:

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

我們的兩種解決方案:

通過(guò)header進(jìn)行解析(推薦):

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

我們可以通過(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)建一個(gè)User對(duì)象。
        return tokenUtil.getUserToken(token);
    }
}

過(guò)濾器二次封裝請(qǐng)求體

我們可以在第一次過(guò)濾器查的時(shí)候,把對(duì)應(yīng)的信息封裝到請(qǐng)求中,但是請(qǐng)求多變,get,post參數(shù)一般在不同的位置上,需要寫(xiě)更復(fù)雜的結(jié)構(gòu)

@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);	
}

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

3. 總結(jié)

我還是推薦方法1,無(wú)疑,雖然多查一次,但是結(jié)構(gòu)簡(jiǎn)單,耦合度低,并且代碼較為簡(jiǎn)潔。

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

相關(guān)文章

最新評(píng)論