最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot通過請求頭獲取當(dāng)前用戶信息方法詳細(xì)示范

 更新時(shí)間:2022年11月30日 08:30:22   作者:文明沖浪  
這篇文章主要介紹了Springboot通過請求頭獲取當(dāng)前用戶信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

一、實(shí)現(xiàn)原理

1、token的存儲

當(dāng)用戶登錄時(shí),將<token, userInfo>存入redis緩存中,以便鑒權(quán)與獲取用戶信息。

2、發(fā)送請求

每次發(fā)送請求時(shí)將token放入請求頭中,令key為“Authorization”或其他值。

3、獲取請求頭部

ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = sra.getRequest();

4、用戶請求頭部攜帶的token在redis中獲得userInfo

二、導(dǎo)入依賴

1、redis相關(guān)依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2、fastjson

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

3、mybatis-plus

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

三、配置文件

server:
  port: 10002
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/myDB?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: <用戶名>
    password: <密碼>
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    #數(shù)據(jù)庫索引
    database: 0
    host: 127.0.0.1
    password: <密碼>
    jedis:
      pool:
        max-idle: 300
        max-active: 600
        max-wait: 1000
    timeout: 3600
    port: 6379
    pool:
      maxTotal: 1000
      testOnBorrow: true

四、代碼實(shí)現(xiàn)

1、RedisUtil

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
 * redis工具類
 */
@Component
public class RedisUtil {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 指定緩存失效時(shí)間
     *
     * @param key  鍵
     * @param time 時(shí)間(秒)
     * @return true or false
     */
    public  Boolean expire(final String key, final long time) {
        stringRedisTemplate.afterPropertiesSet();
        try {
            if (time > 0) {
                stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (final Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 普通緩存獲取
     *
     * @param key 鍵
     * @return 值
     */
    public  Object get(final String key) {
        stringRedisTemplate.afterPropertiesSet();
        return key == null ? null : stringRedisTemplate.opsForValue().get(key);
    }
    /**
     * 普通緩存放入
     *
     * @param key   鍵
     * @param value 值
     * @return true成功 false失敗
     */
    public  Boolean set(final String key, final String value) {
        stringRedisTemplate.afterPropertiesSet();
        try {
            stringRedisTemplate.opsForValue().set(key, value);
            return true;
        } catch (final Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 普通緩存放入并設(shè)置時(shí)間
     *
     * @param key   鍵
     * @param value 值
     * @param time  時(shí)間(秒) time要大于0 如果time小于等于0 將設(shè)置無限期
     * @return true成功 false 失敗
     */
    public  Boolean set(final String key, final String value, final long time) {
        stringRedisTemplate.afterPropertiesSet();
        try {
            if (time > 0) {
                stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                set(key, value);
            }
            return true;
        } catch (final Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 刪除鍵
     * @param key 鍵
     * @return true or false
     */
    public  Boolean del(final String key) {
        stringRedisTemplate.afterPropertiesSet();
        try {
            stringRedisTemplate.opsForHash().delete(key);
            return true;
        } catch (final Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

2、TokenUtil

import java.util.UUID;
public class TokenUtil {
    public static String generateToken() {
        //生成唯一不重復(fù)的字符串
        return UUID.randomUUID().toString();
    }
}

3、UserHelper

import com.alibaba.fastjson.JSONObject;
import com.example.commons.utils.MyStringUtils;
import com.example.commons.utils.ObjectUtil;
import com.example.commons.utils.RedisUtil;
import com.example.commons.vo.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Component
public class UserHelper {
    @Autowired
    private RedisUtil redisUtil;
    /**
     * 獲取當(dāng)前用戶的信息
     * @return userVO
     */
    public UserVO getCurrentUser() {
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (sra == null) {
            return null;
        }
        HttpServletRequest request = sra.getRequest();
        return getCurrentUser(request);
    }
    /**
     * 通過請求獲取當(dāng)前用戶信息
     * @param request 請求
     * @return userVO
     */
    public UserVO getCurrentUser(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (MyStringUtils.isBlank(token)) {
            return null;
        }
        return getCurrentUserByToken(token);
    }
    /**
     * 通過token獲取當(dāng)前用戶信息
     * @param token token
     * @return userVO
     */
    public UserVO getCurrentUserByToken(String token) {
        String context = (String) redisUtil.get(token);
        if (MyStringUtils.isBlank(context)) {
            return null;
        }
        try {
            return JSONObject.parseObject(context, UserVO.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 獲取當(dāng)前用戶的id
     * @return 用戶id
     */
    public Long getCurrentUserId() {
        UserVO userVO = getCurrentUser();
        if (ObjectUtil.isNull(userVO)) {
            return null;
        }
        return userVO.getId();
    }
    /**
     * 獲取當(dāng)前請求
     * @return request
     */
    public HttpServletRequest getHttpServletRequest() {
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (sra == null) {
            return null;
        }
        return sra.getRequest();
    }
}

以上代碼中提到的UserVO、MyStringUtil、ObjectUtil均為本人自定義,比較簡單且與主題關(guān)聯(lián)不大,就不占用篇幅了。

4、登錄

@PostMapping("/login")
public RestResponseEntity Login(@RequestParam("id") Long id) {
    // 此處簡化操作,只要用戶id存在即視為登錄成功
    User user = userService.getUserById(id);
    if (ObjectUtil.isNull(user)) {
        return RestResponseEntity.fail("登錄失敗");
    }
    UserVO userVO = new UserVO();
    userVO.setId(user.getId());
    userVO.setName(user.getUName());
    // 將userVO序列化轉(zhuǎn)成json字符串
    String userContext = JSON.toJSONString(userVO);
    // 隨機(jī)生成一個(gè)token
    String token = TokenUtil.generateToken();
    // 將token與userContext存入redis
    redisUtil.set(token, userContext);
    return RestResponseEntity.success(token);  // 此處響應(yīng)體為自定義
}

5、調(diào)用getCurrentUser實(shí)例

import com.example.commons.vo.UserVO;
import com.example.reader.Helper.UserHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserHelper userHelper;
    @GetMapping("/getUser")
    public UserVO getUser() {
        return userHelper.getCurrentUser();
    }
}

6、測試

(1)登錄測試

請求成功,token與userInfo也已寫入redis

(2)獲得當(dāng)前用戶信息

五、總結(jié)

用這種方法獲取當(dāng)前用戶信息,只需要一句簡單的

UserVO userVO =userHelper.getCurrentUser();

而不需要在controller或者其他業(yè)務(wù)代碼中獲取http頭部,更加整潔。并且將一些用戶常用的信息存入redis中,可以減少檢索數(shù)據(jù)庫的次數(shù),一定程度上可以提高效率。

到此這篇關(guān)于Springboot通過請求頭獲取當(dāng)前用戶信息方法詳細(xì)示范的文章就介紹到這了,更多相關(guān)Springboot請求頭獲取用戶信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中事務(wù)用法示例及實(shí)現(xiàn)原理詳解

    Spring中事務(wù)用法示例及實(shí)現(xiàn)原理詳解

    這篇文章主要給大家介紹了關(guān)于Spring中事務(wù)用法示例及實(shí)現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java?Timer使用講解

    Java?Timer使用講解

    Timer是一種工具,線程用其安排以后在后臺線程中執(zhí)行的任務(wù)??砂才湃蝿?wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行,這篇文章主要介紹了Java?Timer使用講解,需要的朋友可以參考下
    2022-11-11
  • Maven指定JDK版本的實(shí)現(xiàn)

    Maven指定JDK版本的實(shí)現(xiàn)

    本文主要介紹了Maven指定JDK版本的實(shí)現(xiàn),主要有兩種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • java模擬實(shí)現(xiàn)微信紅包算法

    java模擬實(shí)現(xiàn)微信紅包算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)模擬微信紅包算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • idea中使用git插件回滾代碼的流程步驟

    idea中使用git插件回滾代碼的流程步驟

    使用idea開發(fā)java代碼時(shí),如果想回滾git提交的代碼, 需要操作三步,本篇步驟操作前,前提是你的電腦已經(jīng)安裝了git插件,并且你的idea也集成了git插件,下面是詳細(xì)步驟,需要的朋友可以參考下
    2025-04-04
  • IntelliJ IDEA啟動錯(cuò)誤:插件沖突處理的解決方案

    IntelliJ IDEA啟動錯(cuò)誤:插件沖突處理的解決方案

    在使用 IntelliJ IDEA 進(jìn)行開發(fā)時(shí),我們可能會遇到各種啟動錯(cuò)誤,本文將詳細(xì)介紹一種常見的錯(cuò)誤:插件沖突,并提供解決方案,文中通過圖文和代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-02-02
  • spring中@ComponentScan自動掃描并指定掃描規(guī)則

    spring中@ComponentScan自動掃描并指定掃描規(guī)則

    本文主要介紹了spring中@ComponentScan自動掃描并指定掃描規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java中對象的序列化方式克隆詳解

    Java中對象的序列化方式克隆詳解

    在學(xué)習(xí)編程的過程中,我覺得不止要獲得課本的知識,更多的是通過學(xué)習(xí)技術(shù)知識提高解決問題的能力,這樣我們才能走在最前方。這篇文章主要給大家介紹了Java中對象的序列化方式克隆,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • maven+springboot打成jar包的方法

    maven+springboot打成jar包的方法

    這篇文章主要介紹了maven+springboot打成jar包的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Java NIO Files類讀取文件流方式小結(jié)

    Java NIO Files類讀取文件流方式小結(jié)

    本文主要介紹了Java NIO Files類讀取文件流方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

札达县| 邮箱| 东乡族自治县| 抚宁县| 吕梁市| 石柱| 红桥区| 襄垣县| 明星| 堆龙德庆县| 明溪县| 淮滨县| 普陀区| 中卫市| 镇康县| 松阳县| 久治县| 沁阳市| 马公市| 贺兰县| 阳信县| 南投市| 府谷县| 遂川县| 仁布县| 德保县| 曲阳县| 金溪县| 仪陇县| 连南| 广德县| 郁南县| 循化| 永新县| 庆城县| 怀安县| 武平县| 会宁县| 嵊泗县| 白银市| 阳曲县|