[SpringBoot] 8. aop 获取 request response

最近开发有一个需求需要在 aop 中获取request response ,搜索许久没有答案,故此记录📝~


aop 获取

java 复制代码
package com.example.easy_im.aop;

import com.example.easy_im.Context;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Objects;

@Aspect
@Component
@Slf4j
public class TokenAop {


    @Around("@annotation(com.example.easy_im.annotation.NeedToken)")
    public Object check(ProceedingJoinPoint pjp) throws Throwable {

        try {
            HttpServletRequest servletRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
            HttpServletResponse servletResponse = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
            String authorizationHeader = servletRequest.getHeader("Authorization");
            if(StringUtils.isBlank(authorizationHeader) || servletResponse == null) {
                servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return "请携带Authorization请求头";
            }

            // 执行目标方法
            Object proceed = pjp.proceed();

            Context.clear();

            return proceed;
        } catch (Exception e) {
            return "fail";
        }

    }
}

其他部分代码

java 复制代码
package com.example.easy_im.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedToken {
}
java 复制代码
package com.example.easy_im.controller;

import com.example.easy_im.Context;
import com.example.easy_im.annotation.NeedToken;
import com.example.easy_im.dao.UserDao;
import com.example.easy_im.entity.User;
import com.example.easy_im.util.TokenUtil;
import jakarta.annotation.Resource;
import org.springframework.data.domain.Example;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserDao userDao;

    @PostMapping("/login")
    public String login(@Validated @RequestBody User user) {
        User obj = userDao.findUserByNameAndPwd(user.getUserName(), user.getUserPwd());

        if(obj == null) {
            return "fail";
        }
        return TokenUtil.generateToken(obj);
    }

    @DeleteMapping("/logout")
    @NeedToken
    public String logout() {
        String token = Context.getToken();
        TokenUtil.destroyToken(token);
        return "ok";
    }



}
相关推荐
源码_V_saaskw15 分钟前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨24 分钟前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
AntBlack32 分钟前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉
Pomelo_刘金1 小时前
Clean Architecture 整洁架构:借一只闹钟讲明白「整洁架构」的来龙去脉
后端·架构·rust
双力臂4041 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空1 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643142 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0012 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
誰能久伴不乏2 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
itLaity2 小时前
基于Kafka实现简单的延时队列
spring boot·分布式·kafka