1.案例- referer头 --- 防止非法链接;
日常生活中,我们经常在各种网站上下载各种自己喜欢的电影、流行歌曲。我们在网站上下载东西时往往会经历以下一个流程:
下载资源 - > 下载页面 -> 打开广告页面(下载链接) -> 开始下载
我们很可能为了以后下载方便会收藏下载链接,以后我们再想下载时可以直接通过收藏的下载链接避开在满是广告界面找下载链接的过程。但往往会发现直接访问下载链接是无效的,往往返回广告界面。。。为了实现这个功能就需要借助请求头的referer。
首先我们先模拟一个广告界面(一个连简陋都算不上的静态界面)别忘了在头中的“utf-8”格式或“gb2312”格式
<body>
This is my advertisement. <br>
<a href="/day08/ResquestDemo4">下载资源</a>
</body>
在浏览器界面如下:
之后我们开始编写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("资源正在下载......");
}
}
通过模拟广告界面的超链接访问模拟下载链接的结果如下:(我真的是傻,刚刚发现竟然把request拼写错了)
如果直接访问下载链接会是这样(request):
此外还遇到一个问题就是,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>
浏览器界面如下:
之后利用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提交数据:
利用doGet和doPost获取的数据如下:
后记
现在是大二下学期,上学期学长给了我一份关于web开发的网课资料,学了不久就开始复习准备考试。之后打算在假期把剩下的网课资料学完,但假期的执行力为0。假期也不是什么都没干,发现了在优快云上写博客比在笔记本上做笔记更加方便也方便回顾。之后一晃就开学了,下学期的课有点多,也就周末可以来实验室可以学会儿。今后更多的要在实战中学了…
记于2019年3月2日晚 河北大学C1厚德实验室