English 中文(简体)
How to prevent a Demo Java Program from my client s regular use?
原标题:

I have made a demo small program that I want to deliver to my client so that he can run it for 5 times to check its functionality. It is not a big software for which I implement some serial-key functionality and make a trial software.

I want a simple solution which can restrict the use of the program more than 5 times or which can delete itself after its threshold limit.

One solution came in my mind. I make 4 .txt files through the same program and store them at diff. locations on the client computer and these files will store the number of times the program has been run. Each time the application starts, it checks all those files and if any file contain the number representing the threshold limit, it simply exit by saying that the threshold limit has been reached.

Is there any other more better solution, yet simple, to restrict the client from using it various times?

It would be even more better if the program gets deleted after its threshold limit.

最佳回答

If you want it make really simpler, put a time check and don t allow client to run the code when the time has expired after say five days or one week from today

You can try below snippet

Calendar expiry = Calendar.getInstance();
expiry.set(2010, 1, 31,0,0); // Expire at 31 Jan 2010
Calendar now = Calendar.getInstance();
// If you don t trust client s clock, fetch time from some reliable time server
if( now.after(expiry)){
// Exit with proper expiry message
}
else
{ 
// let the customer enjoy your software
} 

You can check here on how to fetch time from a trusted time server.

问题回答

Consider using Java Web Start to deploy your software with a JNLP file per customer with a customer specific, hard to guess, location. This allows you to do centralized management, and delete the JNLP when the time period is up.

Also ensure that a small jar is always uncached so the customer need to contact your server to be able to run.

Let them try it via Remote Desktop or VNC.

For windows applications, I do it in the following manner

I create a registry key inside my program, with the date it was used for the first time. This key is hidden in a field nammed with a non suggestive name and the value encripted;

I also store the last date it was used, to avoid the clock trick.

In my validation code, everytime I start the program, it checks the atual date and the date the program was used for the first time. If it is correct, I store too the last time the program was used. We have 3 cases for validating:

  1. If the atual date is bigger than the initial time, overlaping the demo period, the program isn t used anymore.

  2. If the computer date is smaller than the last time the program was used, the user tried to rewind the system clock. After this the program can t be used anymore

  3. The last case is when the system date is after the initial use date and before the expiration date. In this case, the program is allowed to be used.

    // This code is for system registry access public static Preferences userPref = Preferences.userRoot();

    // Write the registry userPref.put("keyName", "value");

    // Read the registry String read = userPref.get(key, "0");

Instead of 4 files, have single file and write the number (number of times the client can use the demo version) to the file during installation. On every run check whether the file exists, decrement the number and write again to the same file.

If the file is not found or the value is zero exit the program.

Quickly this is what I think.

  1. Create a Data Structure like

class {

prop uid = HOSTNAME; prop MaxUsage = 5; prop AlreadyUsed = 5;

}

  1. Implement this class as Serializable, Write this file to disk without the HOSTNAME e.g. http://www.java2s.com/Code/Java/File-Input-Output/Serializerclass.htm

  2. Ship this serializable file with the application.

  3. When the application runs the first time write the property uid with the HOSTNAME of the host the app is running on. decrement the AlreadyUsed every time the app runs and save it to file.

  4. Every time the application runs check if the file is present, if not exit, if yes then check the uid has the correct HOSTNAME and that the number of Already used is not == 0

If you are using something Like JavaWebstart it will be very easy also.

Hope that helps your cause.

Give them a customer "key" and have the software ask a small servlet on your own web server whether the product is currently valid for the customer with this key.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签