flash mina --策略文件問題詳解
发布时间:2020-12-15 06:56:13 所属栏目:百科 来源:网络整理
导读:首先我們看一下以下這篇文章: http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html 注意以下內容: Socket policy request process Flash Player checks for a socket policy file in three places for each IP connection. The chec
首先我們看一下以下這篇文章: http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html 注意以下內容:
Socket policy request processFlash Player checks for a socket policy file in three places for each IP connection. The checks occur in the following order:
What data is sent in the request and response?The request for a policy file is very simple: Flash Player sends the string? Security.loadPolicyFile("xmlsocket://yourpolicyserver:port"); 然後在指定端口監聽,並返回策略文件即可 如下(使用apache mina): package com.the4thcity.chat.flash;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.the4thcity.chat.ChatConstant;
import com.the4thcity.chat.ssl.BogusSslContextFactory;
public class PolicyServer implements Runnable {
private static final Logger log = Logger.getLogger(PolicyServer.class);
private String hostname = "localhost";
private int port = 843;
private boolean useSSL = false;
private NioSocketAcceptor acceptor;
public PolicyServer(String hostname,int port,boolean useSSL) {
super();
this.hostname = hostname;
this.port = port;
this.useSSL = useSSL;
init();
}
private void init() {
try {
acceptor = new NioSocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
// addLogger(chain);
// MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
// chain.addLast("mdc",mdcInjectionFilter);
if (useSSL) {
addSSLSupport(chain);
}
acceptor.getFilterChain().addLast(
"codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName(ChatConstant.CODEC_CHATSET),LineDelimiter.NUL,LineDelimiter.NUL)));
acceptor.setHandler(new PolicyIoHandler());
} catch (Exception e) {
log.info("[chat Policy error] ",e);
}
}
private void addSSLSupport(DefaultIoFilterChainBuilder chain) throws Exception {
SslFilter sslFilter = new SslFilter(BogusSslContextFactory.getInstance(true));
chain.addLast("sslFilter",sslFilter);
log.info("[chat Policy] SSL ON");
}
private void addLogger(DefaultIoFilterChainBuilder chain) throws Exception {
chain.addLast("logger",new LoggingFilter());
log.info("[chat Policy] Logging ON");
}
@Override
public void run() {
try {
acceptor.bind(new InetSocketAddress(hostname,port));
log.info("[chat Policy] started server,linsten[" + hostname + "] on port:" + port);
} catch (IOException e) {
log.info("[chat Policy eror]:",e);
}
}
}
PolicyIoHandler.java
package com.the4thcity.chat.flash; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import org.apache.log4j.Logger; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import com.the4thcity.chat.ChatConstant; public class PolicyIoHandler extends IoHandlerAdapter { private static final Logger log = Logger.getLogger(PolicyIoHandler.class); @Override public void exceptionCaught(IoSession session,Throwable cause) { cause.printStackTrace(); log.warn("Unexpected exception.",cause); session.close(true); } @Override public void messageReceived(IoSession session,Object ioMessage) { String message = (String) ioMessage; if (ChatConstant.FLASH_SECURITY_REQUEST.equals(message)) {//策略文件 String value = "<?xml version="1.0"?>" + "<cross-domain-policy>" + "<allow-access-from domain="*" to-ports="*" />" + "</cross-domain-policy> |