mybatis custom interception, encrypting user passwords

The first:

package com.Interceptor;
import org.apache.ibatis.executor.Executor;
import com.util.AesEncryptUtil;
import com.zhsh.bean.User;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import java.util.Properties;

/**
 * @author flysand on 2018/07/06
 **/
@Intercepts({
    
    @Signature(type =Executor.class, method = "update", args = {
    
    MappedStatement.class,Object.class})})
public class myPreInterceptor implements Interceptor {
    
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
    
    
    	System.out.println("从这里开始拦截处理,看我的+++++++");
    	MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
    	System.out.println("在这里进行拦截处理++++++=");
        Object args=invocation.getArgs()[1];
        System.out.println("打印目标对象"+mappedStatement);
        //注解中method的值
        String methodName = invocation.getMethod().getName();
        //sql类型
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        if ("update".equals(methodName)) {
    
    
            System.out.println("*******sfsa"+args);
            if (SqlCommandType.INSERT.equals(sqlCommandType)) {
    
    
            	User user=(User)args;
            	String user_pwd=user.getUser_pwd();
            	String user_new_pwd=AesEncryptUtil.encrypt(user_pwd);
            	user.setUser_pwd(user_new_pwd);
            }
            }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
    
    
    	 return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    
    
    }
}

The second:

package com.Interceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;
import com.util.AesEncryptUtil;
import com.zhsh.bean.User;
import java.util.Date;
import java.util.Properties;

/**
 * 通过注解实现哪些方法进行拦截
 */
@Component
@Intercepts({
    
    
        @Signature(
                type = Executor.class, method = "update", args = {
    
    MappedStatement.class, Object.class})})
public class MySqlInterceptor2 implements Interceptor {
    
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
    
    
      System.out.println("进入拦截层=============");
      MappedStatement mappedStatement= (MappedStatement)invocation.getArgs()[0];
      Object parameterObject=invocation.getArgs()[1];
      BoundSql boundSql= mappedStatement.getSqlSource().getBoundSql(parameterObject); 
      Date currentData=new Date(System.currentTimeMillis());
      String sql=boundSql.getSql();
      if(sql.contains("INSERT INTO db_user")||sql.contains("update db_user")) {
    
    
    	  User user=(User)parameterObject;
    	  String user_pwd=AesEncryptUtil.encrypt(user.getUser_pwd());
    	  user.setUser_pwd(user_pwd);
    	  user.setCreate_time(currentData);
      }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
    
    
            return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    
    

    }
}

AES encryption

package com.util;
/**
 * AES 128bit 加密解密工具类
 * @author dufy
 */
import org.apache.tomcat.util.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class AesEncryptUtil {
    
    
	
	//使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
	private static String KEY = "dufy20170329java";
	
	private static String IV = "dufy20170329java";
	
	
	/**
	 * 加密方法
	 * @param data  要加密的数据
	 * @param key 加密key
	 * @param iv 加密iv
	 * @return 加密的结果
	 * @throws Exception
	 */
	public static String encrypt(String data, String key, String iv) throws Exception {
    
    
		try {
    
    
			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"
			int blockSize = cipher.getBlockSize();

			byte[] dataBytes = data.getBytes();
			int plaintextLength = dataBytes.length;
			if (plaintextLength % blockSize != 0) {
    
    
				plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
			}

			byte[] plaintext = new byte[plaintextLength];
			System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

			SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
			IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

			cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
			byte[] encrypted = cipher.doFinal(plaintext);

			return new Base64().encodeToString(encrypted);

		} catch (Exception e) {
    
    
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 解密方法
	 * @param data 要解密的数据
	 * @param key  解密key
	 * @param iv 解密iv
	 * @return 解密的结果
	 * @throws Exception
	 */
	public static String desEncrypt(String data, String key, String iv) throws Exception {
    
    
		try {
    
    
			byte[] encrypted1 = new Base64().decode(data);

			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
			SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
			IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

			cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
			byte[] original = cipher.doFinal(encrypted1);
			String originalString = new String(original);
			return originalString;
		} catch (Exception e) {
    
    
			e.printStackTrace();
			return null;
		}
	}	
	/**
	 * 使用默认的key和iv加密
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String data) throws Exception {
    
    
		return encrypt(data, KEY, IV);
	}
	
	/**
	 * 使用默认的key和iv解密
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static String desEncrypt(String data) throws Exception {
    
    
		return desEncrypt(data, KEY, IV);
	}	
	/**
	* 测试
	*/
	public static void main(String args[]) throws Exception {
    
    
		String test = "620012";
		String data = null;
		String key = "dufy20170329java";
		String iv = "dufy20170329java";
		data = encrypt(test, key, iv);
		System.out.println(data);
		System.out.println(desEncrypt("5tO9SiCX7VYOPz0xYke1eg==", key, iv));
	}
	
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324353049&siteId=291194637