1.通常,我们使用会员身份登录一个资源网站,然后下载里面的资源时点开那个链接就可以直接进行下载了.(不管这个链接是action也好,是html也好,反正都是进行文件下载的)但是如果我们不对这个链接进行设置的话,就会出现这样一个情况:我们将这个链接的地址发送给其他人,而这些人并没有这个网站的会员,或者说根本就没有注册过这个网站,但是因为这是一个单纯的链接,那么将会使这些人也可以打开这个链接进行同样的下载操作,这就是我们所说的盗链.
2.解决这个办法其实很简单,在这个网页上定义一个随机数,然后设置一个session范围内的变量(因为session的作用域是当前会话),并且在资源下载链接中对这个url添加一个请求参数:id=这个随机数,然后当点击这个链接时,使用interceptor拦截器或者直接在execute方法中进行判断,检测用户是否是使用会员登录进入这个资源网站然后下载的,判断的方式是:判断session中的id变量和request请求参数中的id变量的值是否相等,如果相等,则是会员,如果不相等,要么就不是会员,要么就是直接使用链接进行下载的,都进行相应的拦截
3.下面是关键的实现代码:
2.解决这个办法其实很简单,在这个网页上定义一个随机数,然后设置一个session范围内的变量(因为session的作用域是当前会话),并且在资源下载链接中对这个url添加一个请求参数:id=这个随机数,然后当点击这个链接时,使用interceptor拦截器或者直接在execute方法中进行判断,检测用户是否是使用会员登录进入这个资源网站然后下载的,判断的方式是:判断session中的id变量和request请求参数中的id变量的值是否相等,如果相等,则是会员,如果不相等,要么就不是会员,要么就是直接使用链接进行下载的,都进行相应的拦截
3.下面是关键的实现代码:
//资源页面resource.jsp
...
<%
int rand = (int)(Math.randon() * 1000);
session.setAttribute('id' , rand);
...
%>
...
<a href='download.action?id='<%=rand%>&...''>资源下载</a>
...
//download.java
public class download extends ActionSupport{
private String id;
...
//omit setter and getter
@Override
public String execute(){
int logid = Integer.parseInt(getId());
String sessidStr = ActionContext.getContext().getSession().get('id');
int sessid = Integer.parstInt(sessidStr);
if(sessid == logid){
//编写下载资源的代码
}
else if(sessidStr == null){
//用户使用盗链进行下载的情况
}
}
}