📄 altclient.java
字号:
//声明本接口所在的包
package examples.security.acl;
//声明本类引入的其他类
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.naming.Context;
import weblogic.jndi.Environment;
import weblogic.security.PEMInputStream;
import weblogic.security.X509;
import weblogic.security.acl.DefaultUserInfoImpl;
/**
* 以给定的用户名调用RMI。
*
* 这个和Client例程不同在两个方面:
*
*
* 使用环境参数建立初始化JNDI上下文;
*它试图执行两种方式的认证,如果客户端私有密钥和认证允许的情况下。
*
*
*/
public class AltClient
{
/**
* 主方法:检查参数,查找远程对象frobtarget,调用frob方法,打印结果
*/
public static void main(String[] args)
{
Context ctx = null;
if (args.length < 1)
{
//打印用法提示
usage();
}
String url = args[0];
try
{
//JNDI环境
Environment env = new Environment();
//设置url
env.setProviderUrl(url);
// 如果显示给定用户名和密码,使用它们,否则为guest/guest.
String user = null;
//下面解析命令行参数
for (int arg = 1; arg < args.length; arg++)
{
//用户名
if (args[arg].equals("-user") && arg + 1 < args.length)
{
env.setSecurityPrincipal(user = args[++arg]);
}
//密码
else if (args[arg].equals("-pass") && arg + 1 < args.length)
{
env.setSecurityCredentials(args[++arg]);
}
//ssl客户端
else if (args[arg].equals("-sslCert") && arg + 1 < args.length)
{
InputStream[] certs = readCerts(args[++arg]);
if (url.startsWith("t3s") || url.startsWith("https"))
{
env.setSSLClientCertificate(certs);
} else {
fatal("the URL doesn't specify use of SSL");
}
}
//服务器名
else if (args[arg].equals("-servername") && arg + 1 < args.length)
{
if (url.startsWith("t3s") || url.startsWith("https"))
{
env.setSSLServerName(args[++arg]);
} else {
fatal("the URL doesn't specify use of SSL");
}
}
//密钥
else if (args[arg].equals("-keypass") && arg + 1 < args.length)
{
if (url.startsWith("t3s") || url.startsWith("https"))
{
env.setSSLClientKeyPassword(args[++arg]);
} else {
fatal("the URL doesn't specify use of SSL");
}
}
//证书
else if (args[arg].equals("-cert") && arg + 1 < args.length)
{
if (user == null)
{
fatal("user name must be specified before certificate chain");
}
InputStream[] certs = readCerts(args[++arg]);
X509[] x509 = new X509[certs.length];
for (int i = 0; i < certs.length; i++)
{
x509[i] = new X509(certs[i]);
}
env.setSecurityCredentials(new DefaultUserInfoImpl(user, x509));
} else {
usage();
}
}
//获取初始化上下文
ctx = env.getInitialContext();
//查找远程对象
Frobable f = (Frobable) ctx.lookup("frobtarget");
//运行远程方法
f.frob();
System.out.println("Frobbed successfully");
}
catch (Throwable t)
{
t.printStackTrace();
System.out.println("Failed to frob");
}
finally
{
try
{
if (ctx != null)
{
ctx.close();
}
}
catch (Exception e)
{
// 处理任何失败
}
}
}
//定义分隔符
private static final String pathSep =
(String) System.getProperty("path.separator", ":");
//读文件
private static InputStream[] readCerts(String files)
throws IOException
{
Vector inputStreams = new Vector();
StringTokenizer toks = new StringTokenizer(files, pathSep);
int num_files = toks.countTokens();
for (int i = 0; i < num_files; i++)
{
String file = toks.nextToken();
//创建文件流
InputStream is = new FileInputStream(file);
if (file.toLowerCase().endsWith(".pem")) {
//读文件
while ( is.available() > 64 ) {
PEMInputStream pis = new PEMInputStream(is);
inputStreams.addElement(pis);
}
} else {
inputStreams.addElement(is);
}
} // 循环结束
InputStream streams[] = new InputStream[inputStreams.size()];
for (int i = 0; i < inputStreams.size(); i++ ) {
streams[i] = (InputStream)inputStreams.elementAt(i);
}
return streams;
}
//致命错误
private static void fatal(String msg)
{
System.err.println("Error: " + msg);
System.exit(1);
}
//打印用法
private static void usage()
{
System.err.println("Usage:\tjava examples.security.acl.AltClient " +
"URL [-user username]");
System.err.println("\t[-pass password] [-cert cert1" + pathSep + "cert2" +
pathSep + "...]");
System.err.println("\t[-servername hostnameincert] [-sslCert key" + pathSep + "cert1" +
pathSep + "... [-keypass privatekeypassword] ]");
System.err.println("e.g.:\tjava examples.security.acl.AltClient " +
"t3s://localhost:7002 -user guest -pass guest -servername myhost.com");
System.exit(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -