SpringAOP+自定义注解实现REST接口数据加密

本文针对对REST部分接口进行数据加密。

1、使用AOP与自定义注解实现区分特定接口

2、使用AES加密算法对接口数据进行加密。

 

一、SpringAOP有两种配置模式(本文使用标签配置格式)

1、使用Spring配置文件中标签配置

2、使用注解进行配置

 

使用标签配置AOP步骤

1、导入SpringAOP必要的jar包(本文不再赘述,有需要的自行百度)

2、Spring配置文件中配置信息

    
    
    
    
     
        
        
        
         
      
   

3、创建aspect类(此处的自定义注解在下边创建)

此处使用环绕通知

根据这个方法对参数和返回值进行处理:Object result  = pjp.proceed(args);

args为调整后的参数(需要解密的可以在调用这个方法前进行处理);

result为调用实际方法返回值,在此方法后可以对返回值进行处理。

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.fastjson.JSONObject;
import com.runstone.netflow.control.AbsController;
import com.runstone.pojo.services.ResultPojo;
import com.runstone.rsflow.common.redis.client.RsRedisClient;
import com.runstone.rsflow.i18n.I18nUtil;
import com.runstone.rsflow.i18n.RSResourceBundle;
import com.runstone.system.util.AESUtil;
import com.runstone.system.util.ConstantErrorCode;
import com.runstone.system.util.ConstantParam;

/**
 * @author:  lsh
 * @date: 2020-04-17
 *  用于rest接口的数据处理
 **/
public class DataHandleAspect extends AbsController{
	
       
    
    /**
      * 环绕通知:目标方法调用前后执行的代码,可以在方法调用前后完成自定义的行为。
      * 包围一个连接点(join point)的通知。它会在切入点方法执行前执行同时方法结束也会执行对应的部分。
      * 主要是调用proceed()方法来执行切入点方法,来作为环绕通知前后方法的分水岭。
      * 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
      * 而且环绕通知必须有返回值,返回值即为目标方法的返回值
      * @param pjp
      * @return
      * @throws Throwable
     */
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
    	Object res = null;
        //获取自定一注解DataHandle
        MethodSignature sign = (MethodSignature) pjp.getSignature();
        //获取过滤方法是否有自定义标签DataHandle
        DataHandle dataHandle = sign.getMethod().getAnnotation(DataHandle.class); //获取方法上的注解
        //获取过滤方法是否有另一个自定义标签DataHandleReturn
        DataHandleReturn  dataHandleReturn=sign.getMethod().getAnnotation(DataHandleReturn.class); //获取方法上的注解
        //当方法存在注解标志时对数据进行加密解密处理
        if (dataHandle != null) {
            // 调用proceed()方法,就会触发切入点方法执行,执行完方法的返回值
            Object[] args = null;//此处添加你处理好的参数(解密或者其他)
            //返回值加密处理
            Object result  = pjp.proceed(args);
        	
        } else if (dataHandleReturn != null) {
            //其他自定一标签用于与第一个自定标签有区别的操作
        } else {
            //不进行其他操作
            res = pjp.proceed();
        }
       
        return res;
    }
    //加密方法
    private String encrypt(String data) {
    	//添加自己的加密方法
    }

    //解密方法
    private String decrypt(String data) {
    	//添加自己的解密方法
    }
    

}

4、创建自定义注解DataHandle、DataHandleReturn

自定注解主要用于标识方法是否需要处理

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

/**
 * 自定义注解:用于处理rest接口返回值加密
 * @author lsh
 * @since 1.0
 * @see DataHandle
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataHandle {
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解:用于处理rest接口返回值加密
 * @author lsh
 * @since 1.0
 * @see DataHandleReturn
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataHandleReturn {
}

5、在需要过滤加密的接口方法上添加自定义注解

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.runstone.rsflow.services.rest.handle.DataHandleReturn;

@Path("abnormal")
public interface AbnormalRestfulService {
	    /**
	     *  
	     * @param dealId  协议id,根据此id查询对应协议
	     * @return
	     */
	    @GET
	    @Path("/getAbnormalCommunication")
	    @Produces({MediaType.APPLICATION_JSON}) 
	    @DataHandleReturn//返回值加密
	    public String getAbnormalCommunication(@QueryParam("dealId") String dealId);
	    
	    /**
	     * 获取处置策略
	     * @param type 类型
	     * @param id 策略id
	     * @return json
	     */
	    @GET
	    @Path("/getDisposalStrategyCommunity")
	    @Produces({MediaType.APPLICATION_JSON}) 
	    @DataHandleReturn//返回值加密
	    public String getDisposalStrategyCommunity(@QueryParam("type") String type,@QueryParam("id") String id);
	    
	    
}

 

你可能感兴趣的:(AOP,自定义注解,java,spring)