java修改IE(chrome同)代理服务器配置---通过直接修改注册表
原创文章,转载请注明出处:http://passerbyy.iteye.com/blog/1285664 作者:passer_by
因为本文的操作,都是关于修改注册表的,所以希望能够谨慎操作。
方法有两种:
(一)通过自动生成注册表文件,再调用reg.exe命令
在说明本文之前,首先说明有比较简单的方法,java程序自动生成注册表文件*.reg,格式为:
REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"="localhost:8080"
"ProxyOverride"="<localhost>"
然后调用,Runtime.getRuntime().exec( "reg.exe import " + filename);
(二)通过调用registry的api修改
既然目前已经有现成的修改注册表的包jni的registry包,那我们就不费这个事做上面的操作了,registry jar包下载地址 http://www.trustice.com/java/jnireg/index.shtml ,另外发现openorg上也有类似的,但是类名改掉了,感兴趣的同学可以去搜搜。
IE代理服务器对应于注册表中字段:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings下面的值:ProxyServer,ProxyEnable,ProxyOverride
ProxyEnable用来表示是否使用代理,用0,1表示,类型为REG_DWORD,不能为REG_SZ
ProxyServer用来表示代理服务器ip:port,如localhost:8080,类型为REG_SZ
ProxyOverride表示跳过代理的配置,比如跳过本地代理,该值为<local>
修改注册表类Register,以前也有类似的,但是没有区分REG_DWORD和REG_SZ两种类型
import com.ice.jni.registry.NoSuchKeyException;import com.ice.jni.registry.RegDWordValue;import com.ice.jni.registry.RegStringValue;import com.ice.jni.registry.Registry;import com.ice.jni.registry.RegistryException;import com.ice.jni.registry.RegistryKey;public class Register {// 把ICE_JNIRegistry.dll在的路径加载到java.library.path中,这里是放在classpath下面了static {System.setProperty("java.library.path",Register.class.getResource("/").getPath());}public String getValue(String folder, String subKeyNode, String subKeyName)throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException,NoSuchKeyException, RegistryException {RegistryKey software = Registry.HKEY_CURRENT_USER.openSubKey(folder);RegistryKey subKey = software.openSubKey(subKeyNode);String value = subKey.getStringValue(subKeyName);subKey.closeKey();return value;}public int getIntValue(String folder, String subKeyNode, String subKeyName)throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException,NoSuchKeyException, RegistryException {RegistryKey software = Registry.HKEY_CURRENT_USER.openSubKey(folder);RegistryKey subKey = software.openSubKey(subKeyNode);int value = ((RegDWordValue) subKey.getValue(subKeyName)).getData();subKey.closeKey();return value;}public boolean setIntValue(String folder, String subKeyNode,String subKeyName, int subKeyValue) throws NoSuchKeyException,RegistryException {RegistryKey software = Registry.HKEY_CURRENT_USER.openSubKey(folder);RegistryKey subKey = software.createSubKey(subKeyNode, "");RegDWordValue value = new RegDWordValue(subKey, subKeyName);value.setData(subKeyValue);subKey.setValue(value);subKey.flushKey();subKey.closeKey();return true;}public boolean setValue(String folder, String subKeyNode,String subKeyName, String subKeyValue) throws NoSuchKeyException,RegistryException {RegistryKey software = Registry.HKEY_CURRENT_USER.openSubKey(folder);RegistryKey subKey = software.createSubKey(subKeyNode, "");subKey.setValue(new RegStringValue(subKey, subKeyName, subKeyValue));subKey.flushKey();subKey.closeKey();return true;}}import java.io.File;import com.alibaba.b2b.qa.browsers.compare.Browser;import com.ice.jni.registry.NoSuchKeyException;import com.ice.jni.registry.NoSuchValueException;import com.ice.jni.registry.RegistryException;public abstract class IE implements Browser {private static String folder = "SOFTWARE";private static String subKeyNode = "Microsoft\\Windows\\CurrentVersion\\Internet Settings";private static String subKeyNameServer = "ProxyServer";private static String subKeyNameEnable = "ProxyEnable";private static String subKeyNameOverride = "ProxyOverride";private static String subKeyOverrideValue = "<local>";private int originProxyEnable;private String originProxyServer;private String originProxyOverride;private Register register = new Register();public boolean backToOriginValue() {try {register.setIntValue(folder, subKeyNode, subKeyNameEnable,originProxyEnable);register.setValue(folder, subKeyNode, subKeyNameServer,originProxyServer);try {System.out.println("backed key: "+ register.getValue(folder, subKeyNode,subKeyNameServer)+ " "+ register.getIntValue(folder, subKeyNode,subKeyNameEnable));} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}register.setValue(folder, subKeyNode, subKeyNameOverride,originProxyOverride);} catch (NoSuchKeyException e) {e.printStackTrace();return false;} catch (RegistryException e) {e.printStackTrace();return false;}return true;}@Overridepublic boolean changeProxy(String proxyIp, int proxyPort) {try {enableProxy();setProxy(proxyIp, proxyPort);try {System.out.println("after change key: "+ register.getValue(folder, subKeyNode,subKeyNameServer)+ " "+ register.getIntValue(folder, subKeyNode,subKeyNameEnable));} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}setOverride();} catch (NoSuchKeyException e) {e.printStackTrace();return false;} catch (RegistryException e) {e.printStackTrace();return false;}return true;}public boolean saveOriginValue() {try {originProxyServer = register.getValue(folder, subKeyNode,subKeyNameServer);originProxyEnable = register.getIntValue(folder, subKeyNode,subKeyNameEnable);System.out.println("save origin value: " + originProxyServer + " "+ originProxyEnable);} catch (SecurityException e) {e.printStackTrace();return false;} catch (IllegalArgumentException e) {e.printStackTrace();return false;} catch (NoSuchKeyException e) {e.printStackTrace();return false;} catch (NoSuchFieldException e) {e.printStackTrace();return false;} catch (IllegalAccessException e) {e.printStackTrace();return false;} catch (RegistryException e) {e.printStackTrace();return false;}// 没有勾选跳过本地代理服务器时,没有proxyoverride,此时保存为“”,并且返回truetry {originProxyOverride = register.getValue(folder, subKeyNode,subKeyNameOverride);} catch (SecurityException e) {e.printStackTrace();return false;} catch (IllegalArgumentException e) {e.printStackTrace();return false;} catch (NoSuchKeyException e) {e.printStackTrace();return false;} catch (NoSuchFieldException e) {e.printStackTrace();return false;} catch (IllegalAccessException e) {e.printStackTrace();return false;} catch (NoSuchValueException e) {originProxyOverride = "";return true;} catch (RegistryException e) {e.printStackTrace();return false;}return true;}public abstract File getUrlSnapshot(String url);private void enableProxy() throws NoSuchKeyException, RegistryException {register.setIntValue(folder, subKeyNode, subKeyNameEnable, 1);}private void setProxy(String ip, int port) throws NoSuchKeyException,RegistryException {register.setValue(folder, subKeyNode, subKeyNameServer, ip + ":" + port);}private void setOverride() throws NoSuchKeyException, RegistryException {register.setValue(folder, subKeyNode, subKeyNameOverride,subKeyOverrideValue);}public void setRegister(Register register) {this.register = register;}}