Tomcat JNDI 数据库用户名和密码加密(数据库链接池用户和密码加密)

    Tomcat JNDI配置忽略,网上这方面的文章一大堆。废话少说直接代码。
java

package org.apache.tomcat.dbcp;
import javax.naming.RefAddr;
import javax.naming.Reference;

import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;

import com.yjh.commons.CryptoUtils;

public class SecurityDataSourceFactory extends BasicDataSourceFactory {

	@Override
	@SuppressWarnings("rawtypes") 
	public Object getObjectInstance(Object obj, javax.naming.Name name, javax.naming.Context nameCtx,
			java.util.Hashtable environment) throws Exception {

		if ((obj == null) || !(obj instanceof Reference)) {
			return null;
		}

		Reference ref = (Reference) obj;
		 
		RefAddr ra = null;
		int len = ref.size();
		for (int i = 0; i < len; i++) {
			ra = ref.get(i);
			if ("password".equalsIgnoreCase(ra.getType())
					|| "username".equalsIgnoreCase(ra.getType())) {
				ref.remove(i);
				ref.add(i, new TransformRefAddr(ra) {
					private static final long	serialVersionUID	= 1L;

					@Override
					public Object transform(Object obj) {
						//CryptoUtils.decode(String) 提供解密
						return CryptoUtils.decode(obj.toString());
					}
				});
			}
		}

		return super.getObjectInstance(obj, name, nameCtx, environment);
	};

	private abstract class TransformRefAddr extends RefAddr {
		private static final long	serialVersionUID	= 1L;

		private RefAddr				refAddr;

		public TransformRefAddr(RefAddr refAddr) {
			super(refAddr.getType());
			this.refAddr = refAddr;
		}

		@Override
		public Object getContent() {

			return this.transform(refAddr.getContent());
		}

		public abstract Object transform(Object obj);

	}

}

tomcat JNDIP配置 改成apache

<Resource  factory="org.apache.tomcat.dbcp.SecurityDataSourceFactory"
           username="加密用户名" 
	   password="加密密码"
	   .....
		 />

 对于tomcat7+,SecurityDataSourceFacotry,CryptoUtils类不用打jar,放到tomcat HOME lib中。而之前的版本必须放到Tomcat HOME lib中,且JDBC驱动也要放到Tomcat HOME lib中tomcat

相关文章
相关标签/搜索