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

SpringBoot中使用AOP切面編程實(shí)現(xiàn)登錄攔截功能

 更新時(shí)間:2024年12月24日 11:40:15   作者:自律的kkk  
本文介紹了如何使用AOP切面編程實(shí)現(xiàn)Spring Boot中的登錄攔截,通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

使用AOP切面編程實(shí)現(xiàn)登錄攔截

1. 首先實(shí)現(xiàn)一個(gè)登錄注冊(cè)功能

以下代碼僅供參考

控制層

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/register")
    public Result register(@RequestBody UserDto userDto) {
        userService.addUser(userDto);
        return Result.success("注冊(cè)成功");
    }
    @PostMapping("/login")
    public Result<UserLoginVo> login(@RequestBody UserDto userDto) {
        UserLoginVo userLoginVo = userService.login(userDto);
        return Result.success(userLoginVo);
    }
}

業(yè)務(wù)層

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Resource
    private RedisTemplate<String,String> redisTemplate;
    /**
     * 新增用戶/注冊(cè)
     * @param userDto
     */
    public void addUser(UserDto userDto) {
        User user = userMapper.selectByUserName(userDto.getUsername());
        if (user != null) {
            throw new BusinessException(ResponseCodeEnum.CODE_601);
        }
        user = new User();
        BeanUtils.copyProperties(userDto, user);
        user.setCreateTime(new Date());
        user.setLoginTime(new Date());
        userMapper.insert(user);
    }
    @Override
    public UserLoginVo login(UserDto userDto) {
        User user = userMapper.selectByUserNameAndPassword(userDto.getUsername(),userDto.getPassword());
        if (user == null) {
            throw new BusinessException("用戶名或密碼錯(cuò)誤");
        }
        String token = UUID.randomUUID().toString();
        redisTemplate.opsForValue().set("loginDemo:user:token:" + token, user.getId().toString());
        UserLoginVo userLoginVo = new UserLoginVo();
        userLoginVo.setUser(user);
        userLoginVo.setToken(token);
        return userLoginVo;
    }
}

mapper層

@Mapper
public interface UserMapper extends BaseMapper<User>{
    void addUser(User user);
    @Select("select * from user where username = #{username}")
    User selectByUserName(String username);
    User selectByUserNameAndPassword(String username,String password);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.kkk.mapper.UserMapper">
    <insert id="addUser">
        INSERT INTO user (
            username,
            password,
            email
        ) VALUES (
                     #{username},
                     #{password},
                     #{email}
                 )
    </insert>
    <select id="selectByUserNameAndPassword" resultType="com.kkk.domain.entity.User">
        select * from user
        <where>
            <if test="username != null and username != ''">
                and user.username = #{username}
            </if>
            <if test="password != null and password != ''">
                and user.password = #{password}
            </if>
        </where>
    </select>
</mapper>

以上代碼僅供參考,具體邏輯可以根據(jù)自己的業(yè)務(wù)來實(shí)現(xiàn)

2. 補(bǔ)充介紹

以上提供的示例代碼邏輯大致為用戶登錄后根據(jù)UUID生成一個(gè)token,接著將token作為唯一標(biāo)識(shí)鍵存入redis緩存中,值為用戶id,之后可以根據(jù)用戶請(qǐng)求頭中的token去redis中獲取用戶id,當(dāng)然你也可以根據(jù)自己的實(shí)際需求來。

3.AOP切面編程實(shí)現(xiàn)登錄攔截校驗(yàn)

首先目錄結(jié)構(gòu)如圖所示

GlobalInterceptor類

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface GlobalInterceptor {
    /**
     * 校驗(yàn)登錄
     *
     * @return
     */
    boolean checkLogin() default true;
    /**
     * 校驗(yàn)管理員
     *
     * @return
     */
    boolean checkAdmin() default false;
}

GlobalOperationAspect類

@Component("operationAspect")
@Aspect
public class GlobalOperationAspect {
    @Resource
    private RedisTemplate<String,String> redisTemplate;
    @Resource
    private UserMapper userMapper;
    private static Logger logger = LoggerFactory.getLogger(GlobalOperationAspect.class);
    @Before("@annotation(com.kkk.annotation.GlobalInterceptor)")
    public void interceptorDo(JoinPoint point) {
        try {
            Method method = ((MethodSignature) point.getSignature()).getMethod();
            GlobalInterceptor interceptor = method.getAnnotation(GlobalInterceptor.class);
            if (null == interceptor) {
                return;
            }
            /**
             * 校驗(yàn)登錄
             */
            if (interceptor.checkLogin() || interceptor.checkAdmin()) {
                checkLogin(interceptor.checkAdmin());
            }
        } catch (BusinessException e) {
            logger.error("全局?jǐn)r截器異常", e);
            throw e;
        } catch (Exception e) {
            logger.error("全局?jǐn)r截器異常", e);
            throw new BusinessException(ResponseCodeEnum.CODE_500);
        } catch (Throwable e) {
            logger.error("全局?jǐn)r截器異常", e);
            throw new BusinessException(ResponseCodeEnum.CODE_500);
        }
    }
    //校驗(yàn)登錄
    private void checkLogin(Boolean checkAdmin) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String token = request.getHeader("token");
        String value = redisTemplate.opsForValue().get("loginDemo:user:token:"+token);
        if (value == null) {
            throw new BusinessException("登錄超時(shí)");
        }
        Long userId = Long.valueOf(value);
        User user = userMapper.selectById(userId);
        if (user == null) {
            throw new BusinessException("請(qǐng)求參數(shù)錯(cuò)誤,請(qǐng)聯(lián)系管理員");
        }
        if (checkAdmin) {
            // 校驗(yàn)是否為管理員操作權(quán)限
            // 后續(xù)處理
        }
    }
}

接下來只需要在需要攔截的接口處添加自定義注解就可以了

如:

@RestController
@RequestMapping("/test")
public class TestController {
    @GlobalInterceptor
    @GetMapping("/test")
    public String test() {
        return "ok";
    }
}

4. 測(cè)試

首先登錄后獲取用戶token

再將token放入請(qǐng)求頭中

一個(gè)AOP切面編程實(shí)現(xiàn)的登錄攔截就實(shí)現(xiàn)了

到此這篇關(guān)于SpringBoot中使用AOP切面編程實(shí)現(xiàn)登錄攔截的文章就介紹到這了,更多相關(guān)SpringBoot 登錄攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之循環(huán)鏈表

    Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之循環(huán)鏈表

    循環(huán)鏈表是另一種形式的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。它的特點(diǎn)是表中最后一個(gè)結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一個(gè)環(huán)。本文將為大家詳細(xì)介紹一下循環(huán)鏈表的特點(diǎn)與使用,需要的可以了解一下
    2021-12-12
  • Java接口和抽象類的區(qū)別深入剖析

    Java接口和抽象類的區(qū)別深入剖析

    這篇文章主要介紹了Java接口和抽象類的區(qū)別,對(duì)于Java的初學(xué)者來說是需要準(zhǔn)確掌握的概念!
    2014-07-07
  • Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)

    Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)

    這篇文章主要介紹了Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實(shí)現(xiàn)的漢語拼音工具類完整實(shí)例

    Java實(shí)現(xiàn)的漢語拼音工具類完整實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)的漢語拼音工具類,結(jié)合完整實(shí)例形式分析了java基于pinyin4j包實(shí)現(xiàn)編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • java性能優(yōu)化四種常見垃圾收集器匯總

    java性能優(yōu)化四種常見垃圾收集器匯總

    這篇文章主要介紹了java性能優(yōu)化四種常見垃圾收集器匯總,每種垃圾收集器都有其不同的算法實(shí)現(xiàn)和步驟,下面我們簡(jiǎn)單描述下我們常見的四種垃圾收集器的算法過程,感興趣的同學(xué)們最好先看下以下的兩篇文章去增加理解
    2022-07-07
  • 詳解springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁面

    詳解springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁面

    本篇文章主要介紹了springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁面,session一旦失效就需要重新登陸,有興趣的同學(xué)可以了解一下。
    2017-01-01
  • Java中toString函數(shù)的使用示例代碼

    Java中toString函數(shù)的使用示例代碼

    toString()函數(shù)用于將當(dāng)前對(duì)象以字符串的形式返回,比如我定義了一個(gè)User類,創(chuàng)建了一個(gè)user對(duì)象,然后使用相應(yīng)命令去打印user對(duì)象,本文結(jié)合示例代碼介紹了toString函數(shù)的使用,需要的朋友可以參考下
    2024-02-02
  • java累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)

    java累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)

    下面小編就為大家?guī)硪黄猨ava累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • 淺談Java中Lambda表達(dá)式的相關(guān)操作

    淺談Java中Lambda表達(dá)式的相關(guān)操作

    java8新特性,Lambda是一個(gè)匿名函數(shù),類似Python中的Lambda表達(dá)式、js中的箭頭函數(shù),目的簡(jiǎn)化操作,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • springboot整合shiro的過程詳解

    springboot整合shiro的過程詳解

    Shiro 是一個(gè)強(qiáng)大的簡(jiǎn)單易用的 Java 安全框架,主要用來更便捷的 認(rèn)證,授權(quán),加密,會(huì)話管理,這篇文章給大家詳細(xì)介紹Shiro 工作原理及架構(gòu)圖,通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-10-10

最新評(píng)論