我已经编写了一个Java Applet并从我的网站上运行它。
从长远来看,我计划每次使用此applet收取费用。
问题是,是否可以阻止用户下载我的代码(即我的jar文件),然后在家中运行它而不付费?
(在这里我不是指反编译 - 我使用混淆器。我的意思是有人可以轻松使用它,甚至不用反编译或理解它的代码......)
我考虑使用服务器使用HTML发送到applet的更改密码,但我想 - 也许有人知道实现目标的标准方法,而不是重新发明轮子?
谢谢..
答案 0 :(得分:5)
有几种方法可以做到这一点。
您可以在applet的init
方法的开头放置这样的代码,假设它创建了一些组件:
if (!getDocumentBase().getHost().equals("yourhost.com")) {
JOptionPane.showMessageDialog(this, "You can't download it");
return;
}
当然,您必须将yourhost.com
更改为您的实际网站。
您可以将所有代码放在服务器上。为此,我假设您的applet计算整数的立方体。
然后代码对于您的applet看起来像这样:
public class CubingApplet extends JApplet {
private JTextField intField = new JTextField(3);
private JLabel output = new JLabel();
public void init() {
setLayout(new GridLayout(2, 2));
add(new JLabel("Enter an integer: "));
add(intField);
add(new JLabel("The cube of that is: ");
add(output);
intField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
output.setText("" + getCube());
}
};
}
private int getCube() {
try {
int n = Integer.parseInt(intField.getText());
InputStream response = new URL("http://www.yourhost.com/dosomething.php?n=" + n).openStream();
String sResponse = new BufferedReader(new InputStreamReader(response)).readLine();
return Integer.parseInt(sResponse);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
我现在必须停止写这个,但我会尽早添加服务器端代码。
顺便说一下,即使您进行了混淆,也无法进行反编译,也可以识别这些类型的保护方案,并将其删除。因此,您设计的任何保护方案都可能会被短路,因为没有混淆是防弹的。
答案 1 :(得分:3)
如果用户的计算机完成了applet的所有工作,则无法阻止他们下载代码副本。浏览器必须下载代码才能运行它;所有用户需要做的是告诉浏览器保存文件或使用另一个程序。阻止用户脱机使用applet的唯一方法是使用DRM。也许您可以对服务器进行检查以确保使用有效;虽然该程序是免费的,但使用总是有效,但稍后您可以在线验证它。这很容易受到反编译和修改以删除DRM。另一个选择是使用从未公开的代码在您的服务器上进行一些计算,但这当然有缺点,要求您维护服务器进行计算,这可能很昂贵。
答案 2 :(得分:1)
总之没有。任何人都可以查看网页源代码,找到存储小程序的位置并直接下载。如果您的产品不仅限于applet,那么将它作为可执行文件并将其出售可能会更好。
如果确实需要将它作为每次付费且不可下载的applet,您可以在单独的服务器上运行所有实际处理,构建屏幕在服务器,然后将该图像发送到客户端(谁正在使用小程序)。然后,您将在applet上显示该图像。请记住,如果您的程序接受用户输入,则applet必须将该输入发送到要处理的服务器。
答案 3 :(得分:1)
执行此操作的最佳方法是在服务器端上安装一个程序,该程序提供应用程序执行任何有用操作所必需的数据。如果他们购买了一个帐户(他们必须在小程序内登录),他们只允许将小程序连接到此。
由于这是强制服务器端,因此无法绕过限制。
这可以避免他们下载和反编译它的问题,因为他们仍然需要有一个帐户才能使用applet。
缺点是可能需要重新编写applet并为服务器创建一个全新的程序。
答案 4 :(得分:1)
如果您真的希望保护源代码,可以使用 J2EE 并生成在您的Web服务器上运行的servlet。关于这一点的好处是所有的工作都是在服务器端完成的,类似于使用 PHP 。这意味着最终用户只能看到程序的输出,并且无法自己访问程序文件。
可以在这里找到关于J2EE servlet主题的精彩文章: Java Servlet
以下是该页面的引用,我认为这正是您所寻找的:
servlet是一种Java编程语言类,用于扩展服务器的功能。尽管servlet可以响应任何类型的请求,但它们通常用于扩展Web服务器托管的应用程序,因此可以将它们视为在服务器而不是Web浏览器上运行的Java Applet。
答案 5 :(得分:0)
如果您在用户可以使用applet之前实现登录页面,那么您无需阻止他们下载它。任何想要使用的人都必须向您注册(购买)用户名/密码。
此外,您已经使用混淆器来防止反编译,这意味着修改applet以绕过登录并不容易。