Servlet的应用--Referer请求和参数传递
1.referer的应用
(1)利用Referer请求头阻止“盗链”
第一步:
建一个MyHtml.html,内容为
<a href = “http://localhost:8080/demoWeb/test”>retr</a>
第二步:在servlet中判断是否是本地访问
//获取请求消息封装的referer头字段的值
String referrer = request.getHeader("referrer");
//用getServerName()获取localhost
String sitePart ="http://"+request.getServerName();
//判断获取的地址是否为空,如果为空,则跳转页到dowm.html,如果不为空,输出
if(referrer!=null&& referrer.startsWith(sitePart)){
out.println("deading downding");
}else{
RequestDispatcherrequest.
getRequestDispatcher("/down.html");
rd.forward(request, response);
}
第三步:通过地址栏访问
在第一步有一个超链接,当运行MyHtml.html时,这个页面显示出来之后,点击超链接,应该是跳转到另一个界面。
请求消息包含referer头字段,超链接所在的html页面的url地址
Referrer:http://localhost:8080/demohtmlWeb/MyHtml.Html
如果输入的地址是http://localhost:8080/demohtmlWeb/test
则输入的地址不包含请求消息头字段referer,为空
注:
点击超链接的时候,是向web服务器第二次发送了一个servlet请求
(2)利用referer可以隐藏javascript代码:
第一步:创建一个Hide.html的文件,写一段javascript代码来作为隐藏的脚本
<body>
<script text="text/javascript"src="servlet/hide"></script>
</body>
第二步:在servlet中判断输入的地址是否为空
//隐藏javascript代码
String referrer =request.getHeader("referrer");
//获取的是localhost
String sitePart ="http://"+request.getServerName(); if(referrer!=null&& referrer.startsWith(sitePart)){
out.println("document.write('这是一段重要的javascript代码')");
第三步:测试结果
在地址栏上输入http://localhost:8080/demoWeb/Hide.html
当输入这个地址之后,页面上不会有任何的显示,其实是有显示的,在打开Hide.html中转向的servlet地址在地址栏中输出,则会显示下载,其结果是下载之后的文件打开是空的,其实是隐藏了。
2.浏览器传递参数信息的细节:
(1)提交、重置、普通按钮传送参数
String button = request.getParameter(“button”);
注:
(1)在一个FORM表单中可以有多个提交按钮,单击任何一个提交按钮都可以提交表单,只有被单击的提交按钮的名称和值才被作为参数传递,其它提交按钮的信息不会作为参数传递。
(2)表单中的普通按钮与重置按钮的名称和值不会作为参数传递。
(3)没有设置name属性的表单字段元素的信息不会作为参数传递。
(2)单行与多行文本输入框如何传送参数
String text =request.getParameter(“button”);
不管单行和多行文本输入框中是否有内容,设置了name属性的文本输入框的信息总是会作为参数传递。如果文本框中没有输入内容,可以认为其内容为一个空字符串(“”),其参数形式为“text1=”。
(3)单选按钮与复选框如何传送参数
(1)只有被选中的复选框和单选按钮的信息才会作为参数传递,未被选中的复选框和单选按钮的信息不会作为参数传递。
(2)对于多个名称相同的复选框,它们可以同时被选中;对于多个名称相同的单选按钮,只能同时选中其中的任意一个。
(3)对于被选中的多个同名复选框,它们的信息将以多个名称相同的参数进行传递,即参数列表中会出现多个名称相同的参数。
(4)对于没有设置value属性的单选按钮和复选框,当它们被选中时,它们传递的默认参数值为“on”。
(4)隐藏表单字段与图像字段如何传送参数
获取:
String hidden = request.getParameter("hidden1");
System.out.println(hidden);
(1)隐藏表单字段元素总是被作为参数传递给WEB服务器。如果要在提交FORM表单时将网页中的JavaScript程序获得的信息或者上次的WEB服务器端程序产生的标记信息传送给WEB服务器,使用隐藏字段就是一个很好的办法。
(2)图像字段元素也可以提交FORM表单,用户单击图像字段元素后,表单中的其他信息和图像上单击处的x、y坐标一起传送给服务器,x坐标对应的参数名是图像元素名后加上.x(如image1.x),y坐标对应的参数名是图像元素名后加上.y(如image1.y)。
(5)列表框如何传送参数
单选的情况:
String department = request.getParameter("department");
System.out.println(department); //获取的是value
多选的情况:
String department[] =request.getParameter("department");
System.out.println(department); //获取的是value
注:
(1)没有作出选择的列表框的信息不会作为参数传递,就象表单中没有这个列表框的情况一样。
(2)如果设置了列表框字段元素的multiple属性,可以选择列表中的多个选项。对于选中的每个选项,它们都会与列表框的名称分别组合成单独的参数后进行传递,这样,参数列表中会出现多个名称为列表框名的同名参数。
(3)当选中没有设置value属性的列表选项时,浏览器使用该选项的标题作为参数值。
(6)使用Javascript防止重复提交表单
在<head></head>标签中插入即可
<script>
var isCommitted = false;
function checkPost()
{
if(!isCommitted)
{
isCommitted = true;
return true;
}
else
{
alert("不能重复提交表单");
return false;
}
}
</script>
<form action="servlet/RepeateFormServlet"method="POST" οnsubmit="return checkPost()">...
(7)彻底删除和删除的思路分析
1、要彻底删除要在数据库中
Delete from 表名
Where id in(‘01’,’02’,’03’);
2、只是删除会垃圾箱里
Update 表名
Set flag=1
Where id in(‘01’,’02’,’03’);
3、前台所做的事:
获取复选框中的所有制
<input type=”checkbox” value=”001”,name=”booklist”/>
<input type=”checkbox” value=”002”,name=”booklist”/>
<input type=”checkbox” value=”003”,name=”booklist”/>
<input type=”checkbox” value=”004”,name=”booklist”/>
<input type=”checkbox” value=”005”,name=”booklist”/>
4、在servlet中获取
String arr[] = request.getParameterValues(“booklist”):
String s = “”;
if(arr!=null){
for(Stringarr1:arr){
System.out.println(arr1);
}