不一定要会很多的东西,但是你要知道有这么个东西,在需要的时候将它们联系起来。
如果是一个购物网站,对于客户的来源是相当的关注的,如果我们知道这些进入我们页面的的用户是通过哪些网站跳转进来的,我们就可以知道在哪些网站的广告是有效益的。
之前对HTTP的连接几乎为零,最近稍微关注了一下,感觉HTTP应该是一个巨大的宝藏,它记录很多可以被程序猿使用的、有价值的内容,比如今天要提到的REFERER的头消
息。这个是记录请求是从哪里跳转进来的。
问题1:获取REFERER头消息中的内容,这个对于j2ee来说就不是个事,我们只要从request中获取这个头消息的内容即可:
问题2:随着了解的深入,对盗链的理解也就开始明白了。假如用户想要获取某种资源,而这种资源被其他网站盗链的话,这对于资源的所有者的损害可是相当巨大的。所以我们
就必须防止盗链,只有是相关网站链接过来的,才能获取资源。
必须通过如下网站的连接才能访问:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="ad.jsp">只有通过这个才能被访问</a>
</body>
</html>
要访问的页面 ad.jsp
在这个页面中通过获取头字段中的内容来判断,是则显示,否则重定向到之前的网址。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ad.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
String ref=request.getHeader("REFERER");
System.out.println(ref);
String webSite="http://localhost:8080/daolian/index.jsp";
System.out.println(webSite);
if(ref==null || !ref.equals(webSite)){
response.sendRedirect(webSite);
}
%>
看到了~
</body>
</html>
问题3:如何伪造REFERER头信息
下意识就去查看request中有没有设置头信息的方法,答案是没有。也对,jsp或servlet是被动的,它是来接受别人的请求的。后来想到这个HttpURLConnection 可以设置头信
息,但是我将j2ee和j2se的内容生硬的撕开了。当我利用这个类将相应网页的HTML代码下载。
此时就是如何将这些内容以HTML页面的形式来表现了,jsp和servlet在本质上是一样的,所以servlet也是能够展示相关内容的,而展示页面内容则是PrintWriter的功劳了,此时将获取的HTML代码放入到这个类中,大功告成。
package com.xh.web.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FakeReferer extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
String path="http://localhost:8080/daolian/ad.jsp";
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setRequestProperty("referer", "http://localhost:8080/daolian/index.jsp");
InputStream iis = conn.getInputStream();
PrintWriter out = response.getWriter();
byte[] bs=new byte[1024];
int length=0;
while((length=iis.read(bs, 0, bs.length))!=-1){
out.print(new String(bs,0,length,"utf-8"));
System.out.println(new String(bs,0,length,"utf-8"));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request,response);
}
}