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

相關文章
相關標籤/搜索