您的位置:首页 > 移动开发

applet使用实践

2015-07-09 11:38 1726 查看

前言

做的一个项目中,需要浏览器调用本地的一些脚本程序来实现一些功能,一开始看了下火狐插件,发现太麻烦了,于是还是回到了老方法,使用applet来实现。

applet使用

public class AssistorUtil extends Applet{
public void init(){
this.serverip = getParameter("serverip");
this.assistname = getParameter("assistname");
}
public void paint(Graphics g){
g.drawString("处理中...",20,25);
}


html里加入

<applet id="assistor" code="assistorPlugin.AssistorUtil.class"
archive="assistor.jar"
width="500" height="300">
</applet>


无jar包则不写archive=”assistor.jar”

调用本地脚本

public  List<String> runShell2( String shStr) throws Exception{
List<String> strList = new ArrayList<String>();
Process process;
process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null);
InputStreamReader ir = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
process.waitFor();
while ((line = input.readLine()) != null){
strList.add(line);
}
return strList;
}


init方法只调用一次

而且paint方法在浏览器最小化后重新打开仍然会调用

applet的权限

applet默认自然是没有权限调用本地脚本的,这里通常有两个方法进行处理

1. 修改本地policy文件

2. 签名applet的jar包

修改policy

编辑/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64/jre/lib/security/java.policy文件,添加

grant {
permission java.security.AllPermission;
};


但是这种方法需要修改客户端权限,如果是互联网应用的话肯定是无法使用的。

签名JAR包

讲已经写好的applet打为jar包,这里我使用eclipe进行的打包

生成密钥库

keytool -genkey -keystore assistor.store -alias assistor -validity 3650


导出签名时用到的证书

keytool -export -keystore assistor.store -alias assistor -file assistor.cert


签名jar压缩文档

jarsigner -keystore assistor.store assistor.jar assistor


签名后,在大多数版本中,都可以通过手动授权后直接调用applet了,而且applet拥有操作本地文件的权限。



JS调用APPLET

很多情况下,都需要与JS结合使用APPLET,这里写一个方法,用于提供给JS调用

写了一个java方法,里面调用本地脚本,再使用JS去调用

HTML里如下

<html>
<title>assistorUtil demo</title>
<hr>
<applet id="assistor" code="assistorPlugin.AssistorUtil.class" archive="assistor.jar" width="500" height="300">
</applet>
<hr>
<input type="button" value="try_it" onclick="tryassist()"/>
<input type="button" value="result" onclick="result()"/>
<script type="text/javascript">
function tryassist(){
alert(1);
document.assistor.setName("10.1.81.225","10.1.81.222");
alert(2);
var res = document.assistor.startconfig();
alert(3);
alert(document.assistor.getResult());
alert(document.assistor.isok());
}

function result(){

alert(document.assistor.getResult());
alert(document.assistor.isok());
}
</script>


JS调用applet权限问题

之后发现,尽管已经对JAR包进行了签名,再调用本地脚本时候,仍然不能成功。如果放开policy文件里的权限发现是可以成功的。

查了资料后,发现可以通过在代码中赋予权限,进行调用

代码类似于:

public  List<String> runShell( final String shStr) throws Exception{
final List<String> strList = new ArrayList<String>();

AccessController.doPrivileged(new PrivilegedAction(){

@Override
public Object run() {
Process process;
try {
process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null);

InputStreamReader ir = new InputStreamReader(process
.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
process.waitFor();
while ((line = input.readLine()) != null){
strList.add(line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return strList;
}
});

return strList;
}


之后再实验,发现成功了!

参考

http://www.chinaunix.net/old_jh/80/158712.html

[精华] Java、Java Applet与 JavaScript间的通信

讲解

http://www.w3cschool.cc/java/java-applet-basics.html

http://blog.csdn.net/majiabao123/article/details/3944379

APPLET权限

http://www.cnblogs.com/tqsummer/archive/2011/01/19/1939013.html

JS调用APPLET权限

http://blog.csdn.net/faye0412/article/details/4566400
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: