【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)

1.案例- referer头 --- 防止非法链接;

日常生活中,我们经常在各种网站上下载各种自己喜欢的电影、流行歌曲。我们在网站上下载东西时往往会经历以下一个流程:
下载资源 - > 下载页面 -> 打开广告页面(下载链接) -> 开始下载
我们很可能为了以后下载方便会收藏下载链接,以后我们再想下载时可以直接通过收藏的下载链接避开在满是广告界面找下载链接的过程。但往往会发现直接访问下载链接是无效的,往往返回广告界面。。。为了实现这个功能就需要借助请求头的referer。
首先我们先模拟一个广告界面(一个连简陋都算不上的静态界面)别忘了在头中的“utf-8”格式或“gb2312”格式

 <body>
  
    This is my advertisement. <br>
    <a href="/day08/ResquestDemo4">下载资源</a>
       
  </body>

在浏览器界面如下:【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)
之后我们开始编写servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		/*代表下载资源文件
		 * referer:表示当前请求来自于哪里
		*/
		String referer =request.getHeader("referer");
		System.out.println("rederer="+referer);
		// Ctrl+Shift+/   在代码窗口中是这种/*~*/注释    Ctrl+Shift+\  自动取消已经注释的代码
		
        //根据请求头可以判定该请求是否为非法请求:1)直接访问(referer=null)
        //		                                                                  2)当前请求不是来源于广告页面(!referer.contains("adv.html"))
		if(referer==null||!referer.contains("/adv.html")){
			response.getWriter().write("您当前请求为非法请求,请转到首页<a href='/day08/adv.html'>首页</a>)");
		}else {
			response.getWriter().write("资源正在下载......");
		}
		
	}

通过模拟广告界面的超链接访问模拟下载链接的结果如下:
【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)
如果直接访问下载链接会是这样:
【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)
此外还遇到一个问题就是,MyEclipse2017CI版本按照网上教程改了servlet.java文件中doGet和doPost的模板,重启MyEclipse后发现引用doGet和doPost还是老样子。
还有就是一个问题就是分不清"String referer"与"refererstring"的区别。

2.获取参数数据(尝试)
<body>
   <h3>测试GET方式提交数据</h3>
	<form action="/day08/ResquestDemo5" method="get">
		账号:<br> <input type="text" name="account1" value="请输入您的账号"><br>
		密码:<br> <input type="text" name="password1" value="请输入您的密码"><br>
		<input type="submit" value="submit">
	</form>
	<hr>
	<h3>测试POST方式提交数据</h3>
	<form action="/day08/ResquestDemo5" method="post">
		账号:<br> <input type="text" name="account2" value="请输入您的账号"><br>
		密码:<br> <input type="text" name="password2" value="请输入您的密码"><br>
		<input type="submit" value="submit">
	</form>
  </body>

浏览器界面如下:【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)
之后利用doGet方式获取数据:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
         /*  
          * 获取get方式提交的参数 ,(URI后面的参数数据)        
		*/
		String params=request.getQueryString();
		System.out.println(params);
	}

利用doPost方式获取数据:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
	    /*	
	     * 获取post提交的参数(实体内容中)
		*/
		ServletInputStream in =request.getInputStream();
		byte[] buf =new byte[1024];
		int len=0;
		while( (len=in.read(buf))!=-1){
			String str=new String(buf,0,len);
			System.out.print(str);
		}
	}

之后分别以get和post提交数据:
【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)
利用doGet和doPost获取的数据如下:
【web开发】案例- referer头 --- 防止非法链接;获取参数数据(尝试)

后记