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
相关文章推荐
- UnityShader实例07:在shader调用unity内置lightmap和light Probes
- Android:解决view.getDrawingCache()返回null的问题
- iOS开发 - CoreLocation地理定位
- Swift教程之String的运用
- 托管态update更新异常——a different object with the same identifier value was already associated withthe sess
- error: No resource identifier found for attribute 'format24Hour' in package 'android'
- Android智能指针——读书笔记
- Android 使用shape制作drawable素材
- [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
- [iOS]iOS发送短信
- UIWebView内存泄露问题解决方法(ios自学笔记)
- iOS开发经验技巧之iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault)
- Android 随手势滑动销毁(finish)Activity
- cocos2d-x新手引导的实现
- iOS开发经验技巧之stringByReplacingCharactersInRange: withString: 實現字符串删除,替换
- ios layout机制相关方法
- webview相关
- android 移动基地接入遇到的问题
- iOS中滤镜的使用(二)滤镜组合
- IOS正则表达式的简单介绍