spring boot 使用aop实现拦截器

实现功能:对某个目录下所有请求接口进行拦截判断,如检测登录状态等。

需要pom.xml引入aop:

org.springframework.boot
            spring-boot-starter-aop

具体实现:

package com.tuijie.gainguest.common.aspect;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
//import com.tuijie.gainguest.common.enums.JsonCodeEnum;
//import com.tuijie.gainguest.common.result.JsonResp;
//import com.tuijie.gainguest.controller.Constants;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;

/**
 * @Author: admin
 * @Description: 切面AOP
 * @Date Created in 9:39 AM 2020/3/31
 * @Modified By:
 */
@Aspect
@Component
@Slf4j //log日志,可选
public class SysPointcut {
    // 放行接口
    private final static String[] excludePathPatterns = {
            "/api/sysUserAdmin/login",
            "/api/sysUserAdmin/logout",
    };
    private static final SerializerFeature[] serializerFeatures;
    static {
        serializerFeatures = new SerializerFeature[] {
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullListAsEmpty
        };
    }

    /**
     * 后台管理切面AOP
     * 定义切入点,切入点为com.tuijie.gainguest.controller.admin包下所有类-接口
     * 通过@Pointcut注解声明频繁使用的切点表达式
     */
    @Pointcut("execution(* com.tuijie.gainguest.controller.admin..*.*(..)))")
    public void BrokerAspect() {}

    @Around("BrokerAspect()")
    public Object beforeExec(ProceedingJoinPoint pjp) throws Throwable {
        //获取request信息
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        assert sra != null;
        HttpServletRequest request = sra.getRequest();
        HttpSession session = request.getSession();

        String uri = request.getRequestURI();
        if (!Arrays.asList(excludePathPatterns).contains(uri)) {
            Object admin = session.getAttribute(/*Constants.ACCOUNT_SESSION*/"test");
//            JsonResp jsonResp;
            if (admin == null) {
                log.warn("未登录: [{}] [{}]", session.getId(), uri);
//                jsonResp = JsonResp.fail(JsonCodeEnum.OVERTIME.getMessage(), JsonCodeEnum.OVERTIME.getCode());
                HttpServletResponse response = sra.getResponse();
                assert response != null;
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/json; charset=UTF-8");
                PrintWriter writer = response.getWriter();
                writer.write(JSON.toJSONString(/*jsonResp*/new HashMap(){{put("id", 1);}}, serializerFeatures));
                writer.flush();
                writer.close();
                return null;
            }
        }

        return pjp.proceed();
    }

}

Original: https://www.cnblogs.com/007sx/p/12605377.html
Author: 007少侠
Title: spring boot 使用aop实现拦截器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540447/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 接上篇:Git Worktree 高级使用,这样清爽多了

    前言 上一篇文章 Git Worktree 大法真香 带大家了解了 git worktree 是如何帮助我同时在多个分支工作,并且互不影响的。但是创建 worktree 的目录位置…

    Java 2023年6月5日
    069
  • 开发当中curl简单使用

    curl是linux上可以发送http请求的命令。当然Postman是一个很好的接口调用管理工具,但在验证一个linux服务器调用另外一个linux服务器API是否可用的场景下,非…

    Java 2023年6月14日
    071
  • 15分钟学会JWT使用

    什么是JWT? JSON Web Token ,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。 jwt 可以生成 一个加密的token,做为用户登录…

    Java 2023年6月9日
    066
  • Maven(一)——下载与安装

    Maven(一)——下载与安装 下载 安装 解压即安装 配置 依赖Java,需要配置JAVA_HOME 设置MAVEN自身运行环境,配置MAVEN_HOME 新建系统变量MAVEN…

    Java 2023年6月16日
    059
  • ipchat 点对点聊天工具 1.00.05 已发布

    ipchat 点对点聊天工具 1.00.05 已发布。 zg-ipchat 是一款聊天工具。可实现简单的文本信息传输,无加密。点对点直接通讯,无需中间服务器,支持 Pv6/IPv4…

    Java 2023年6月9日
    065
  • Java,求一个字符串中指定字符出现的次数

    如题,这里介绍两种方式 1、把字符串转化成字符数组,然后通过for循环比对出结果 这种方式虽然明面上看着有for循环,实际执行速度却很快,也很好理解。 2、用string的spli…

    Java 2023年6月5日
    077
  • 安装jar包到本地maven仓库命令

    执行命令mvn install:install-file -DgroupId=net.neoremind -DartifactId=fountain-common -Dversio…

    Java 2023年6月13日
    096
  • 浅谈JWT

    JWT 常见的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basi…

    Java 2023年6月5日
    085
  • 网络编程

    网络编程 计算机网络是指将 地理位置不同的具有独立功能的 多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及 网络通信协议的管理和协调下, 实现资源共享和…

    Java 2023年6月6日
    088
  • 1950. Maximum of Minimum Values in All Subarrays

    题目: You are given an integer array nums of size n. You are asked to solve n queries for ea…

    Java 2023年5月29日
    058
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    Java 2023年6月16日
    091
  • 每日一题(2022-5-24):经典搜索算法

    题目 给定一个文件目录的路径,统计这个目录下所有的文件数并返回 分析 这道题很容易想到深搜或者广搜,不仅考察了对搜索算法的应用,还考察了对文件的操作,这道题在面试的时候还是很常见的…

    Java 2023年6月9日
    063
  • rabbitmq安装

    rabbitmq简介 rabbitmq安装 rabbitmq是erlang语言开发的,rabbitmq安装需要先安装erlang,再安装rabbitmq; ​ 官方网址: 双击安装…

    Java 2023年6月16日
    061
  • Java之NIO

    下面展示自己代码熟悉Java的NIO编程的笔记。 1、缓冲区(Buffer) /* 一、缓冲区(Buffer):在Java 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的…

    Java 2023年5月29日
    067
  • java.lang.IllegalAccessException;java.lang.Class.newInstance

    问题:Exception in thread “main” java.lang.IllegalAccessException: Class cn.sheng…

    Java 2023年5月29日
    0104
  • Java:常用反射获取类信息

    Constructor getConstructor(Class… parameterTypes):返回单个公共构造方法 Constructor getDeclared…

    Java 2023年6月7日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球