red5(二) 防止盗链
public boolean appConnect(IConnection conn, Object[] params) { if (conn instanceof IServiceCapableConnection) { //调用客户端代码 IServiceCapableConnection sc = (IServiceCapableConnection) conn; sc.invoke("clientMethod", new Object[]{"One", 1},this); } return super.appConnect(conn, params); }
?其中的clientMethod是客户端方法名称,new Object[]{"One", 1}是任意参数,this为必选
并书写接收客户端返回参数的方法
public void resultReceived(IPendingServiceCall arg0) { String host = arg0.getResult().toString(); String allowHost = “http://localhost:28080/redxserver”; boolean allow = false; if(host.indexOf( allowHost)>0){ allow = true; } if(!allow ){//获取当前的链接IConnection current = Red5.getConnectionLocal();current.close(); System.out.println("关闭连接"); }else { System.out.println("不关闭连接"); }}?在播放器as内书写方法
var client1:Object=new Object();client1.clientMethod=this.clientMethod;_connection.client =client1;
?
private function clientMethod(str:String,num:Number):String{ var str:String = ExternalInterface.call("window.top.location.href"); return str;}还要修改BaseRTMPHandler.java中的方法,防止as方法出错了,仍然可以播放。
具体如下?
protected void handlePendingCallResult(RTMPConnection conn, Notify invoke) {final IServiceCall call = invoke.getCall();final IPendingServiceCall pendingCall = conn.retrievePendingCall(invoke.getInvokeId());if (pendingCall != null) {// The client sent a response to a previously made call.Object[] args = call.getArguments();if ((args != null) && (args.length > 0)) {// TODO: can a client return multiple results?pendingCall.setResult(args[0]);}Set<IPendingServiceCallback> callbacks = pendingCall.getCallbacks();if (!callbacks.isEmpty()) {HashSet<IPendingServiceCallback> tmp = new HashSet<IPendingServiceCallback>();tmp.addAll(callbacks);for (IPendingServiceCallback callback : tmp) {try {callback.resultReceived(pendingCall);} catch (Exception e) {log.error("Error while executing callback {} {}", callback, e);//关闭连接,添加下面两行即可conn.close();break;}}}}}?
?
通过以上方法即可实现防止盗链
已经优化了,请看下一篇文章 red5(三) 防止盗链
?