My favorites | Sign in
Project Logo
                
Search
for
Updated Jun 16, 2008 by maclema
JavaPolicyFileServer  

# Sample Java Flash Policy File Server.

This is a simple Java servlet, that opens a server socket on port 843 when the web application is started. It listens for "<policy-file-request/>\0" requests, and writes the policy file to the connected client.

The policy file is read from "/tomcat/policyserver/ROOT/flashpolicy.xml", this can be changed in the servlet code.

Here is what you will need in web.xml:

<servlet>
	<servlet-name>PolicyServerServlet</servlet-name>
	<servlet-class>com.maclema.flash.PolicyServerServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>PolicyServerServlet</servlet-name>
	<url-pattern>/policyserver</url-pattern>
</servlet-mapping>

and here is the servlet code:

package com.maclema.flash;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.servlet.http.HttpServlet;

public class PolicyServerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private static ServerSocket serverSock;
	private static boolean listening = true;
	private static Thread serverThread;
	
	static {
		try {
			serverThread = new Thread(new Runnable(){
				public void run() {
					try {
						System.out.println("PolicyServerServlet: Starting...");
						serverSock = new ServerSocket(843, 50);
						
						while ( listening ) {
							System.out.println("PolicyServerServlet: Listening...");
							final Socket sock = serverSock.accept();
							
							Thread t = new Thread(new Runnable() {
								public void run() {
									try {
										System.out.println("PolicyServerServlet: Handling Request...");
										
										sock.setSoTimeout(10000);
										
										InputStream in = sock.getInputStream();
										
										byte[] buffer = new byte[23];
										
										if ( in.read(buffer) != -1 && (new String(buffer)).startsWith("<policy-file-request/>") ) {
											System.out.println("PolicyServerServlet: Serving Policy File...");
											
											//get the local tomcat path, and the path to our flashpolicy.xml file
											File policyFile = new File("/tomcat/policyserver/ROOT/flashpolicy.xml");
											
											BufferedReader fin = new BufferedReader(new FileReader(policyFile));
											
											OutputStream out = sock.getOutputStream();
											
											String line;
											while ( (line=fin.readLine()) != null ) {
												out.write(line.getBytes());
											}
											
											fin.close();
											
											out.write(0x00);
											
											out.flush();
											out.close();
										}
										else {
											System.out.println("PolicyServerServlet: Ignoring Invalid Request");
											System.out.println("  " + (new String(buffer)));
										}
										
									}
									catch ( Exception ex ) {
										System.out.println("PolicyServerServlet: Error: " + ex.toString());
									}
									finally {
										try { sock.close(); } catch ( Exception ex2 ) {}
									}
								}
							});
							t.start();
						}
					}
					catch ( Exception ex ) {
						System.out.println("PolicyServerServlet: Error: " + ex.toString());
					}
				}
			});
			serverThread.start();
			
		}
		catch ( Exception ex ) {
			System.out.println("PolicyServerServlet Error---");
			ex.printStackTrace(System.out);
		}
	}
	
	public void destroy() {
		System.out.println("PolicyServerServlet: Shutting Down...");
		
		if ( listening ) {
			listening = false;
		}
		
		if ( !serverSock.isClosed() ) {
			try { serverSock.close(); } catch ( Exception ex ) {}
		}
	}
}

and this is my flashpolicy.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" to-ports="3306" />
</cross-domain-policy>

Sign in to add a comment
Hosted by Google Code