<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ### 獲取當前登錄用戶 ```java // 注入工具類 @Autowired private SecurityUtil securityUtil; // 獲取當前登錄用戶【部分數據,從內存即線程線程變量中獲取數據,推薦使用】 // 包含id、username、nickname、mobile、email、departmentId、type、permissions(角色和菜單名) User user = securityUtil.getCurrUserSimple(); // 獲取當前登錄用戶【完整數據,調用SQL和Redis緩存查詢】 User user = securityUtil.getCurrUser(); ``` ### 數據權限 - 獲取當前用戶數據權限(可訪問的部門ID),返回List<String>,null代表具有所有權限 ```java // 注入工具類 @Autowired private SecurityUtil securityUtil; // 獲取當前用戶數據權限 List<String> ids = securityUtil.getDeparmentIds; // 獲取是否僅自己數據權限 Boolean isSelfDataPerm = securityUtil.isSelfDataPerm(); ``` - 需自行根據在業務邏輯層或DAO層進行過濾使用,原理即使用SQL中的`in`語句 - JPA示例一 ```java @Override public Page<User> findByCondition(User user, Pageable pageable) { return userDao.findAll(new Specification<User>() { @Nullable @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> cq, CriteriaBuilder cb) { Path<String> departmentIdField = root.get("departmentId"); List<Predicate> list = new ArrayList<Predicate>(); // 數據權限過濾 List<String> depIds = securityUtil.getDeparmentIds(); if(depIds!=null&&depIds.size()>0){ list.add(departmentIdField.in(depIds)); } Predicate[] arr = new Predicate[list.size()]; cq.where(list.toArray(arr)); return null; } }, pageable); } ``` - JPA示例二 ```java // DAO層 public interface UserDao extends XbootBaseDao<User, String> { List<User> findByDepartmentIdIn(List<String> departmentIds); } // 業務邏輯層 ... @Autowired private UserDao userDao; // 數據權限過濾 userDao.findByDepartmentIdIn(securityUtil.getDeparmentIds()); ... ``` - Mybatis-Plus示例 ```java ... QueryWrapper<User> qw = new QueryWrapper<User>(); // 數據權限過濾 qw.in("department_id", securityUtil.getDeparmentIds()); IPage<User> data = iUserService.page(PageUtil.initMpPage(page), qw); ... ``` ### 自定義多維度IP、uid限流示例 ```java // 注入 @Autowired private RedisRaterLimiter redisRaterLimiter; // IP限流 1秒限1個請求 String token = redisRaterLimiter.acquireToken(ip, 1, 1000); if (StrUtil.isBlank(token)) { throw new XbootException("你手速怎么這么快,請點慢一點"); } ``` ### 分布式同步鎖 ```java // 注入 @Autowired private RedisLockTemplate redisLockTemplate; redisLockTemplate.execute("訂單流水號", 3, TimeUnit.SECONDS, new Callback() { @Override public Object onGetLock() throws InterruptedException { // TODO 獲得鎖后要做的事 log.info("生成訂單流水號"); return null; } @Override public Object onTimeout() throws InterruptedException { // TODO 未獲取到鎖(獲取鎖超時)后要做的事 log.info("oops 沒拿到鎖"); return null; } }); ``` ### Redis使用scan命令替換keys - `keys`命令效率極低,屬于`O(N)`操作,會阻塞其他命令,在集群上會是災難性的操作。XBoot框架`common`包中已提供基于`scan`操作封裝的方法,詳見`RedisTemplateHelper` ```java // 注入 @Autowired private RedisTemplateHelper redisTemplateHelper; // 方式一 先獲取滿足表達式的key 然后刪除 Set<String> keys = redisTemplateHelper.scan("key::*"); redisTemplateHelper.delete(keys); // 方式二 直接通過表達式刪除所有key redisTemplate.deleteByPattern("key::*"); ``` ### 第三方工具類庫包`Hutool` > 已包含大量實用工具類,建議收藏仔細閱讀,詳見官方文檔 [https://www.hutool.cn/docs/#/](https://www.hutool.cn/docs/#/) #### Xss攻擊過濾 - Vue中使用`v-html`或富文本編輯器時需根據業務需求后端過濾Xss攻擊,調用hutool提供的方法即可 ```java HtmlUtil.fiter("要過濾的內容") ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看