[开发] springboot使用aop

因为springboot项目想使用jwt,每个restful接口都需要验证token的有效性,所以决定使用springboot+aop拦截所有请求进行token校验。

项目结构如下图:
项目结构

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dingkai</groupId>
    <artifactId>account</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>account</name>
    <description></description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <druid.version>1.0.18</druid.version>
        <fastjson.version>1.2.8</fastjson.version>
        <mybatis.version>1.3.1</mybatis.version>
        <pagehelper.version>5.1.2</pagehelper.version>
        <jwt.version>0.9.0</jwt.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>

        <dependency> <!-- exclude掉spring-boot的默认log配置 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入log4j2依赖 -->
        <dependency> 
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- Mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <!-- MySQL启动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- 分页查询插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>

        <!-- JWT -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jwt.version}</version>
        </dependency>

        <!-- aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

2.ControllerInterceptor.java

package com.dingkai.account.Interceptor;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class ControllerInterceptor {
    private final Logger logger = LogManager.getLogger(this.getClass());

    @Pointcut("execution(public * com.dingkai.account.controller..*(..))")
    public void controllerMethodPointcut(){}

    @Before("controllerMethodPointcut()") //指定拦截器规则
    public Object interceptor(JoinPoint jp){
        MethodSignature signature = (MethodSignature) jp.getSignature();
        Method method = signature.getMethod(); //获取被拦截的方法
        String methodName = method.getName(); //获取被拦截的方法名
        logger.info("interceptor ***************************");
        logger.info("methodName: "+methodName);
        return null;
    }
}

3.LoginController.java

package com.dingkai.account.controller;

import com.alibaba.fastjson.JSONObject;
import com.dingkai.account.model.User;
import com.dingkai.account.service.LoginService;
import com.dingkai.account.util.HttpCode;
import com.dingkai.account.util.MD5Util;
import com.dingkai.account.util.ResponseUtil;
import com.dingkai.account.util.UuidUtil;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@CrossOrigin(origins = "*")
@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;

    private final Logger logger = LogManager.getLogger(this.getClass());


    @GetMapping(value = "test")
    @ResponseBody
    public void test(){
        System.out.println();
    }

    @PostMapping(value = "login")
    @ResponseBody
    public void login(@RequestBody String jsonStr,HttpServletRequest request, HttpServletResponse response){
        String uuid=UuidUtil.getUUID();

        JSONObject jsonObject=JSONObject.parseObject(jsonStr);

        User user=loginService.login(
                jsonObject.getString("username"),
                MD5Util.MD5(jsonObject.getString("password"))
        );
        logger.info(uuid+" login ************************************");
        logger.info("user: "+user);
        //登陆失败
        if(user==null){
            ResponseUtil.RESPONSE(request,response,"104",uuid,"用户不存在",null);
        }
        //登陆成功
        else{
            String token = Jwts.builder()
                    .setSubject(user.getUsername())
                    .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 24 * 1000))
                    .signWith(SignatureAlgorithm.HS512, "account")
                    .compact();
            response.addHeader("Authorization", token);
            ResponseUtil.RESPONSE(request,response,"0",uuid,"success",user);
        }
    }

}

运行项目并请求test接口
查看日志如下,说明springboot+aop已经成功,接下来只要在里面添加自己的token验证逻辑即可

[03:50:42:639] [INFO] - com.dingkai.account.Interceptor.ControllerInterceptor.interceptor(ControllerInterceptor.java:29) - interceptor ***************************
[03:50:42:639] [INFO] - com.dingkai.account.Interceptor.ControllerInterceptor.interceptor(ControllerInterceptor.java:30) - methodName: test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值