在线试听(播放器)防止盗链下载实现讨论_障眼法实现

本文探讨了《读者》电子出版平台中如何实现MP3音频在线试听但禁止用户直接下载的功能。通过使用Servlet处理音频请求并结合播放器参数控制,确保只有合法用户能够下载音频。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

《读者》电子出版平台有个附属项目,需求描述是这样的:

1.《读者》发行了电纸书,附带着一个集成的机子,可以方便用户更新资料,每一个资源都附有MP3音频文件,读者可以在线免费试听,也可以下载音频文件,但是下载的时候要付费下载!

2.对于购买了电纸书的,是优惠下载一年,之后按照本站VIP会员优惠条件下载!

.................................................................

其他的描述省略了!

讨论下如何实现MP3音频试听不能下载这功能呢?

实现MP3播放最简单的功能是使用windows media player 插件代码如下:

 

<object id=MediaPlayer1
						codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading
						type=application/x-oleobject height=65 width=480 classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 viewastext>
						<param name="URL" value="<%=request.getContextPath()%>/servlet/ListernOrDownLoad?productId=<%=request.getParameter("productId")%>&amp;action=<%=request.getParameter("action") %>" />
						<param name="webURLPlayer" value="false" />
						<param name="AudioStream" value="-1" />
						<param name="AutoSize" value="0" />
						<param name="AutoStart" value="-1" />
						<param name="AnimationAtStart" value="-1" />
						<param name="AllowScan" value="-1" />
						<param name="AllowChangeDisplaySize" value="-1" />
						<param name="AutoRewind" value="0" />
						<param name="Balance" value="0" />
						<param name="BaseURL" value />
						<param name="BufferingTime" value="5" />
						<param name="CaptioningID" value />
						<param name="ClickToPlay" value="-1" />
						<param name="CursorType" value="0" />
						<param name="CurrentPosition" value="-1" />
						<param name="CurrentMarker" value="0" />
						<param name="DefaultFrame" value />
						<param name="DisplayBackColor" value="0" />
						<param name="DisplayForeColor" value="16777215" />
						<param name="DisplayMode" value="0" />
						<param name="DisplaySize" value="4" />
						<param name="Enabled" value="-1" />
						<param name="EnableContextMenu" value="-1" />
						<param name="EnablePositionControls" value="0" />
						<param name="EnableFullScreenControls" value="0" />
						<param name="EnableTracker" value="-1" />
						<param name="InvokeURLs" value="-1" />
						<param name="Language" value="-1" />
						<param name="Mute" value="0" />
						<param name="PlayCount" value="5" />
						<param name="PreviewMode" value="0" />
						<param name="Rate" value="1" />
						<param name="SAMILang" value />
						<param name="SAMIStyle" value />
						<param name="SAMIFileName" value />
						<param name="SelectionStart" value="-1" />
						<param name="SelectionEnd" value="-1" />
						<param name="SendOpenStateChangeEvents" value="-1" />
						<param name="SendWarningEvents" value="-1" />
						<param name="SendErrorEvents" value="-1" />
						<param name="SendKeyboardEvents" value="0" />
						<param name="SendMouseClickEvents" value="0" />
						<param name="SendMouseMoveEvents" value="0" />
						<param name="SendPlayStateChangeEvents" value="-1" />
						<param name="ShowCaptioning" value="0" />
						<param name="ShowControls" value="-1" />
						<param name="ShowAudioControls" value="-1" />
						<param name="ShowDisplay" value="0" />
						<param name="ShowGotoBar" value="0" />
						<param name="ShowPositionControls" value="-1" />
						<param name="ShowStatusBar" value="-1" />
						<param name="ShowTracker" value="-1" />
						<param name="TransparentAtStart" value="-1" />
						<param name="VideoBorderWidth" value="0" />
						<param name="VideoBorderColor" value="0" />
						<param name="VideoBorder3D" value="0" />
						<param name="Volume" value="100" />
						<param name="WindowlessVideo" value="0" />
					</object>

 参数URL直接放置MP3音频文件的地址即可播放!但是这样的话,会将地址暴露给用户,

未登录的用户或者是费用不足的用户可以直接看见地址,使用迅雷等工具进行下载!

再简单一点处理加密地址的话,将URL参数使用成如下地址:

 

<param name="URL" value="<%=request.getContextPath()%>/servlet/ListernOrDownLoad?productId=<%=request.getParameter("productId")%>&amp;action=<%=request.getParameter("action") %>" />

 使用一个Servlet去请求地址,代码示例如下:

 

public class ListernOrDownLoad extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		String action = request.getParameter("action");
		User hideUser = (User) session.getAttribute("user");
		int userId = null != hideUser ? hideUser.getId() : 0;
		int productId = Integer.parseInt(request.getParameter("productId"));
		Product product = ProductMgr.getInstance().loadById(productId);
		String musicUrl = MusicMgr.getInstance().findByProductId(productId).getUrl();
		if (action.equals("listen")) {
			out.print(getMMSHostName(request) + musicUrl);
		}
		if (action.equals("download")) {
			if (0 == userId) {
				out.print("你还没有登录,请<a href='" + getHttpHostName(request) + "userAdmin/userLogin.jsp'>登录</a>!");
				return;
			}
			Integral integral = IntegralMgr.getInstance().findByUserId(userId);
			if (null == integral || integral.getIntegral() < 0 || integral.getIntegral() < product.getMemberPrice()) {
				out.print("您的余额不足!,请<a href='" + getHttpHostName(request) + "integral/add.jsp'>充值</a>!");
				return;
			}
			integral.setIntegral(integral.getIntegral() - product.getMemberPrice());
			integral.setUserId(userId);
			IntegralMgr.getInstance().update(integral);
			out.print("<a href='" + getHttpHostName(request) + "/servlet/getAdress?userId="+userId+"&amp;url=" + musicUrl + "&amp;now=" + DateUtils.getDate(userId,new Date()) + "'>点击下载</a>");
		}
		out.flush();
		out.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

	private String getMMSHostName(HttpServletRequest request) {
		String basePath = "mms://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "";
		return basePath;
	}

	private String getHttpHostName(HttpServletRequest request) {
		String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "";
		return basePath;
	}

}
 哪位朋友也许说了,为设么不自己开发一个player呢?使用Flex等?嘿嘿,要是自己去开发的话就没有必要讨论这个问题了,项目的经费就那么一点,什么都自己开发那可真是赔大了!嘿嘿!

方式二:使用js文件来控制参数传递:

使用js文件控制选择不同的播放器来播放不同的音频文件,支持如下格式

 

"WMA" : "WMP",

		"MP3" : "MP3",
		"WMV" : "WMP",
		"ASF" : "WMP",
		"MPG" : "WMP",
		"MPEG" : "WMP",
		"AVI" : "WMP",
		"ASX" : "WMP",
		"RM" : "Real",
		"RMVB" : "Real",
		"RAM" : "Real",
		"RA" : "Real",
		"SWF" : "Flash",
		"FLV" : "Flv"

 核心是一个js文件依据不同的文件格式来调用不同的播放器来实现!参见附件中。

但是这样实现之后,文件一依然是暴露在外面的!还得使用Servlet等方式返回一个地址,或使用Ajax的方式在播放的时候去请求地址!这也是一个办法!

这里就没有继续往下写!

 

源文件:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title> new document </title> 
<meta name="author" content="" /> 
<meta name="keywords" content="" /> 
<meta name="description" content="" /> 
</head> 
 
<body> 
<script type="text/javascript" src="player.js"></script> 
<script type="text/javascript"> 
<!--
var myPlayer = new Player();
myPlayer.play("1.mp3",800,600,true);
//-->
</script> 
</body> 
</html> 

 也许以上想法是很粗糙的,很原始的,或是很傻瓜式的实现方式,我们称其为障眼法实现方式,只能蒙蔽一般的使用者,但是对于稍微懂点程序代码的人来说,就是小儿科了!

以上料中想法优缺点,相信大家都很明了,我也就不说了,我这里说这个问题,只是抛砖引玉,希望大家有好的办法,既经济又快速的办法,或好的思路能与大家分享!因为现在这方面还比较流行,随便一个什么网站,什么管理类的系统,尤其是政府部门的办公管理系统,功能不多,类似要求辅助功能不少,希望大家多多交流跟帖!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值