[转载]Java网络加载协议(JNLP)及Java Web Start

2014年9月28日星期日 | | 0 评论 |

Java网络加载协议(JNLP)及Java Web Start
翻译:cherami
mail:[email protected]
 
原文:http://java.sun.com/jdc/JDCTechTips/2001/tt0530.html


在java开发的早期,重点被放在了客户端开发。语言中对于applet和安全下载的支持
对于万维网(WWW)的发布看上去是个不错的主意。但是现实是java最大的成功在于服务器端,java的强大功能和适应性赢得了服务器端开发者的心。同时,客户端的开发落后了。棘手的开发问题限制了applet的效用,开发者被迫转向基于浏览器的瘦客户端。

Java Network Launching Protocol (JNLP,java网络加载协议) 承诺改变这个现状。通过JCP(Java Community Process)的JSR-56的开发,
JNLP解决了很多先前用java开发针对客户端的功能的问题。一个JNLP客户端是一个应用程序或者说服务,它可以从宿主于网络的资源中加载应用程序。如果你使用JNLP打包一个应用程序,那么一个JNLP客户端能够:

o 为该应用探测,安装并且使用正确版本的JRE(java运行时环境)
o 从浏览器或者桌面加载应用程序
o 当新版本的应用出现时自动下载最新的版本。
o 为了加速启动速度在本机缓存应用程序需要的类
o 可以作为applet或者应用程序运行
o 在必要的情况下下载原始的库
o 以安全的方式使用诸如文件系统这样的本机资源
o 自动定位和加载外部依赖资源

Sun 提供了一个实现JNLP的称为Java Web Start(JWS)的参考实现。让我们使用它开发一个使用JFC Swing的简单应用。为了做这个,你需要从http://java.sun.com/products/javawebstart下载JWS。(译者注:JDK的新版本JDK1.4已经内置JWS,无须另外下载。)

下面是应用程序的代码:

//File HelloJNLP.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class HelloJNLP extends JFrame {
  public HelloJNLP() {
    super("Hello JNLP");
    String loadedFrom = this.getClass().getClassLoader().toString();
    JLabel jl = new JLabel("loaded by " + loadedFrom);
    JEditorPane jtp = new JEditorPane("text/plain",
                                                  "Edit this text");
    getContentPane().add(jl, BorderLayout.NORTH);
    getContentPane().add(jtp, BorderLayout.CENTER);
  }

  public static void main(String [] args) {
    JFrame f = new HelloJNLP();
    f.setBounds(100,100,325,250);
    f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter() {
      public void windowClosed(WindowEvent e) {
        System.out.println("Shutting down...");
        System.exit(0);
      }
    });
  }
}

JNLP的核心是一个发布清单(deployment manifest)。它是一个使用.jnlp做
扩展名的XML文件(JNLP规范简单的称之为"JNLP 文件")。要发布HelloJNLP,你需要在JNLP文件中描述它,就像下面这样:

<?xml version="1.0" encoding="UTF-8"?>
<!-- file Hello.jnlp -->
<jnlp codebase="http://staff.develop.com/halloway/TechTips/May2001"
href="http://staff.develop.com/halloway/TechTips/May2001/Hello.jnlp">
        <information>
    <title>Hello</title>
    <vendor>Tech Tips Sample May 2001</vendor>
    <icon href="HelloJNLP.jpg"/>
  </information>
  <resources>
    <j2se version="1.2+"/>
    <jar href="HelloJNLP.jar"/>
  </resources>
  <application-desc main-class="HelloJNLP"/>
</jnlp>

这个清单包含客户端需要下载和使用HelloJNLP的所有信息:

o jnlp元素的codebase属性指出搜索应用程序资源的顶级URL。
o information元素指出一个JNLP用户接口可以显示给客户端的信息。
o j2se元素指出客户端必须有1.2版本或者更新的J2SE(tm)。(这是对于applet开发的一个大的提高,因为它常常受限于浏览器提供的VM(虚拟机))
o jar元素指出程序的JAR文件的相对于jnlp codebase位置。
o application-desc元素指出要运行的类。你可以添加子元素用以指定命令行参数或者系统属性。

要将这个应用程序发布给一个web服务器,你需要执行以下的步骤:

1. 修改jnlp的codebase和hrefURL为你自己的web服务器的合适的URL。
   
2. 将JNLP文件发布到web服务器。

3. 编译并打包HelloJNLP.java并发布到web服务器。例如:
  
   jar cvf HelloJNLP.jar HelloJNLP.class HelloJNLP$1.class
  
4. 创建一个图标HelloJNLP.jpg并将之安装在web服务器上。你可以使用
   http://staff.develop.com/halloway/TechTips/May2001/HelloJNLP.jpg
  
5. 设置你的web服务器的mime-type关联:.jnlp映射到mime-type application/x-java-jnlp-file。例如,对于Apache,添加如下一行到mime.types:
  
   application/x-java-jnlp-file    jnlp
  
   重新启动web服务器。

从客户端执行那个应用程序,首先确认你已经安装了JWS。然后简单的在浏览器中指向该jnlp文件。JWS客户端将下载该jnlp文件,下载必要的资源,加载应用程序。你所看到的将是在一个编辑区中显示的文本"Edit this text" 。如果你在配置web服务器上有问题或者不能使用web服务器,你可以从
http://staff.develop.com/halloway/TechTips/May2001/Hello.jnlp
加载这个程序。

注意HelloJNLP不是作为一个applet运行在浏览器中,而是作为一个独立的应用程序。

当你关闭程序时,HelloJNLP使用System.out打印消息"Shutting down...",然而没有控制台可见。控制台是JWS的诸多设置中缺省设置为"off"的其中一个。这是你可以修改的一对设置中的一个值,就像下面这样:

1. 编辑JWS安装目录中的javaws.cfg文件。添加一行"javaws.cfg.forceUpdate=true"。
这会导致JWS在启动应用程序前自动检查更新的版本。
  
2. 运行JWS。使用菜单File->Preferences,进入Advanced标签并且选择"Show Java Console"。(由于JDK1.4中的本机化,JWS将显示中文的界面,所以此处的因为被自动显示为对应的中文)同意,选择"Log Output"将日志输出到你选择的文件。当你在调试时并且需要捕获System.out和System.err时是非常有用的。

HelloJNLP显示一个编辑器,但是编辑器的内容在你关闭程序后将丢失。将下面的代码添加到HelloJNLP.java会自动的将编辑器的状态存储到客户端的硬盘上:

//changes to HelloJNLP.java
import java.io.*;
import java.net.*;
import javax.jnlp.*;

  //replace the constructor with this new version: 
  JEditorPane jtp;
  public HelloJNLP() {
    super("Hello JNLP, Second Version");
    String loadedFrom = this.getClass().getClassLoader().toString();
    JLabel jl = new JLabel("loaded by " + loadedFrom);
    jtp = new JEditorPane("text/plain", "Edit this text");
    readEditorContents();
    getContentPane().add(jl, BorderLayout.NORTH);
    getContentPane().add(jtp, BorderLayout.CENTER);

    addWindowListener(new WindowAdapter() {
        public void windowClosed(WindowEvent e) {
          System.out.println("Shutting down...");
          try {
            writeEditorContents();
          }
          catch (Exception ex) {
            System.out.println("Yoinks!");
            ex.printStackTrace();
          }
          System.exit(0);
        }
      });
  }

  //add these helper methods
  private void writeEditorContents() throws
                UnavailableServiceException, IOException {
      System.out.println("writeEditorContents");
    PersistenceService ps = (PersistenceService)
      ServiceManager.lookup("javax.jnlp.PersistenceService");
    BasicService bs = (BasicService)
      ServiceManager.lookup("javax.jnlp.BasicService");
    URL baseURL = bs.getCodeBase();
    System.out.println("CodeBase was " + baseURL);
    URL editorURL = new URL(baseURL, "Editor");
    try {
      ps.create(editorURL, 1024);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    FileContents fc = ps.get(editorURL);
    DataOutputStream os = new DataOutputStream(
                                 fc.getOutputStream(false));
    String s = jtp.getText();
    os.writeUTF(s);
    os.flush();
    os.close();
  }

  private void readEditorContents() {
    try {
      PersistenceService ps = (PersistenceService)
        ServiceManager.lookup("javax.jnlp.PersistenceService");
      BasicService bs = (BasicService)
        ServiceManager.lookup("javax.jnlp.BasicService");
      URL baseURL = bs.getCodeBase();
      URL editorURL = new URL(baseURL, "Editor");
      FileContents fc = ps.get(editorURL);
      DataInputStream is = new DataInputStream(fc.getInputStream());
      jtp.setText(is.readUTF());
      is.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

(译者注:正常编译需要在CLASSPATH中添加javaws.jar的路径,在windows下为C:/Program Files/Java Web Start目录下)
JNLP API定义了一套的服务用以绕过安全沙盒使得一些通常的客户端操作可以使用。
在writeEditorContents方法中,BasicService查找应用程序的代码目录,然后
PersistenceService将编辑区的内容缓存在本机硬盘上,这些内容被键入到一个和应用程序目录相对的URL下。PersistenceService提供的名字/值对数据和浏览器的cookies很相似。JWS通过一对被称为"muffins"的东西实现了这个,muffins不时候用来存储大数据,他们应该用于在客户端缓存小的标识符。然后这些标识符能被用于在服务器上定位大的信息。

在web服务器上重新发布修改过的应用程序,然后试着从客户端运行它--依然通过URL。如果你没有web服务器,你可以从
http://staff.develop.com/halloway/TechTips/May2001/Hello2.jnlp 运行这个新版本。JWS自动探测程序被改变并运行新的版本。你可以通过检查标题条的字符串来证实这点,它现在将显示"Hello JNLP,Second Version." 修改编辑区的内容,然后关闭它。当你再次加载该程序时,你的改变会出现。(当你第一次运行新版的程序时你会在控制台看到一个异常,这是因为readEditorContents 第一次不能找到muffin。)
(译者注:实际上第一次运行时出现的异常导致程序无法正常结束,从而使得编辑区的内容无法写入客户端,下次运行时也相当于第一次运行。即此程序无法展示文章的特性,可能是于笔者的JWS的版本有关,笔者使用的是最新的1.0.1_02(build b03))
JNLP提供了比这里演示的更多的服务。例如,你可以:

o 很好的控制程序如何被下载
o 描述各个JAR之间的依赖关系
o 下载并运行本机代码安装程序
o 对签名的代码授予附件的权限
o 请求指定版本的程序或者applet

要了解更多有关JNLP的情况,请到
http://java.sun.com/products/javawebstart/download-spec.html
下载JNLP规范。

要了解更多JWS的情况,请参考http://java.sun.com/products/javawebstart/

 

[分享]服务器如果配置有Lantronix的kvm如何使用?如何通过KVM备份系统ghost备份?

| | 0 评论 |

服务器如果配置有Lantronix的kvm如何使用?首先需要你的服务器配置了Lantronix的kvm,然后登录。登录后如何使用?我们看看下图:


首先你需要确保你的机器已经安装了java运行环境点这里下载。点击KVM链接,会提示下载


下载并打开jnpl文件,download-spider-jnlp.png

提示证书安全的,都点 是

003.png
 
004.png


看到桌面了,点 箭头所指的地方,就可以输入用户名密码了



如果需要加载ISO文件(例如安装系统教程KVM如何加载ISO文件安装操作系统),如下图: 


如果打算安装windows 2003系统,要注意,默认不支持SATA硬盘,需要先在bios里面吧硬盘设置为ata兼容模式,然后才能安装2003.

安装完成windows 2003后,可以用kvm做个ghost备份。如果您不会弄,可以付费让我们帮你做,服务费:100元/次/3小时


如何通过KVM备份系统ghost备份?


参考: http://bbs.fjbjdd.com/thread-1258-1-1.html

 

[转]分享.JNLP文件怎么打开

| | 0 评论 |

分享.JNLP文件怎么打开

用java程序打开

首先要确定你已经装好了jre 首先你需要确保你的机器已经安装了java运行环境点这里下载


改好了环境变量
然后,开始——运行——cmd
javaws D:\××××\××××\××××.jnlp

也可以用打开方式. 找到javaws.exe

如果你的jre装的没有问题,那你的屏幕上就应该出现了java程序,并开始下载啦
 

[安全]Bash 'shellshock' bug is wormable

2014年9月27日星期六 | | 0 评论 |

Early results from my scan: there's about 3000 systems vulnerable just on port 80, just on the root "/" URL, without Host field. That doesn't sound like a lot, but that's not where the bug lives. Update: oops, my scan broke early in the process and stopped capturing the responses -- it's probably a lot more responses that than.

Firstly, only about 1 in 50 webservers respond correctly without the proper Host field. Scanning with the correct domain names would lead to a lot more results -- about 50 times more.

Secondly, it's things like CGI scripts that are vulnerable, deep within a website (like CPanel's /cgi-sys/defaultwebpage.cgi). Getting just the root page is the thing least likely to be vulnerable. Spidering the site, and testing well-known CGI scripts (like the CPanel one) would give a lot more results, at least 10x.

Thirdly, it's embedded webserves on odd ports that are the real danger. Scanning for more ports would give a couple times more results.

Fourthly, it's not just web, but other services that are vulnerable, such as the DHCP service reported in the initial advisory.

Consequently, even though my light scan found only 3000 results, this thing is clearly wormable, and can easily worm past firewalls and infect lots of systems. One key question is whether Mac OS X and iPhone DHCP service is vulnerable -- once the worm gets behind a firewall and runs a hostile DHCP server, that would "game over" for large networks.



Update: As many people point out, the path variable isn't set, so I need '/usr/ping' instead to get even more results.

Update: Someone is using masscan to deliver malware. They'll likely have compromised most of the system I've found by tomorrow morning. If they using different URLs and fix the Host field, they'll get tons more.


Brandon Potter2:12 AM

I put together a vulnerability checker, but depends on wget or curl being available.

Embeds wget and curl calls into the User-Agent, Cookie, and Referer headers, and if the test tool hears back from the called server, the vulnerability is confirmed.

http://shellshock.brandonpotter.com


Matt DeLong5:03 PM

Try this:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

You will see one of 2 result:

1) You are VULNERABLE IF YOU SEE THIS RESULT
vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

2) You are NOT VULNERABLE IF YOU SEE THIS RESULT
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test


From:

http://blog.erratasec.com/2014/09/bash-shellshock-bug-is-wormable.html

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271



Test Specific Script:

http://shellshock.brandonpotter.com/
http://bashsmash.ccsir.org/

命令: bash --version

[转][分享]如何取消Excel中的自动超链接

2014年9月17日星期三 | | 0 评论 |

在Excel单元格中输入的网址或电子邮件地址,在默认情况下会自动变为超级链接,误点击后会弹出一个写邮件的窗口,有的时候明明是不需要的,真够烦人的。下面的方法,可以有效的解决Excel中的自动超链接问题。
  

①右键→取消超链接
  将鼠标定位到该单元格并右击,在弹出的菜单中选择「取消超级链接」命令即可。
  ②编辑→选择性粘贴→数值
  右击含有超链接的列(或行)并选择「复制」,接着在该列右边(或左边)插入一空白列,然后右击该空白列,选择「选择性粘贴」,在随后出现的「选择性粘贴」窗口中,点选「数值」选项
  ③CTRL+C→Enter
  移动键盘上的方向键,选中链接所在单元格(可多选),然后CTRL+C,然后再按一下Enter键就OK了。这可能是最简单有效的方法。
  
  ④自动更正选项设置
  Excle2007-13:Office按钮→Excle选项-校对-自动更正选项→键入时自动套用格式→Internet及网络路径替换为超链接
  Excle97-2003:工具-自动更正选项-键入时自动套用格式→Internet及网络路径替换为超链接
  这是解决邮箱地址或网址自动变成链接的根本所在,是一劳永逸的办法,
  ⑤批量处理法
  Alt+F8打开宏窗口,在「宏名」处输入一个名称后单击「创建」,然后在Sub与End Sub之间输入「Cells.Hyperlinks.Delete」,保存创建的宏后返回Excel。 
  打开「工具」菜单下的「宏」子菜单中的「宏」,在打开的窗口中选中刚刚创建的宏,单击「执行」,稍候片刻即可把当前表格中所有超级链接全部取消。


所有文章收集于网络,如果有牵扯到版权问题请与本站站长联系。谢谢合作![email protected]