过滤器 Filter
Filter,Listener
监听器和过滤器,都是一种特殊的Servlet,其中监听器是用来处理服务器端事件,过滤器是在请求送出以后,响应到达客户端之前的事情进行处理。
用户的请求到达Servlet(JSP)之前,先经过过滤器处理,服务器的响应到达客户浏览器之前,也要先经过过滤器的处理。
过滤器可以有多个,形成过滤器链filter chain。
一、可以设置对哪些页面或Servlet使用过滤器
1.应用程序中所有资源 /*
2.指定的类型文件资源 *.html
3.指定的目录下的所有文件 /folder_name/*
4.指定的servlet myfilter.LoggerServlet
6./simplefilter.html
7.指定目录下指定类型的单一文件 /dir_name/index.jsp
以上都要注意是否有斜杠“/”
二、可以设置对何种请求方式使用过滤器,请求方式包括(request,forward,include,exception)
request
href=”a.jsp”
response.sendRedirect(“a.jsp”);
window.open(“a.jsp”);
location.href=”a.jsp”;
src=”a.jsp”
………
forward 页面跳转
<%jsp:forward ….
sendForward …
include
有两种include其他页面的方法,一种是指令标签<%@ include file=”xxx.jsp”%>,一种是动作标签
execetion
……
一个验证用户名唯一性的例子:
register.jsp功能
1.用户输入用户名密码
2.注册按钮
3.检查用户按钮
4.post uname到CheckIt
CheckIt功能:
1.获得用户名
2.取得Map
3用户名与Map钟的Key比较(contain)
welcome.jsp功能
1.欢迎界面
问题
(注:有一个隐藏按钮,它的值flag有三种状态
0代表用户没按过检测
1代表用户名不能通过(Map中已存在)
3代表用户名能通过
)
有一种可能,用户写了个可以通过检测的Map中不存在的用户名,通过检测后,改为一个Map中已经存在的用户名,此时不按检测用户名,直接注册,它还是能通过到welcome.jsp 既造成用户名重复。
解法1:
只要有修改用户民输入框就要强迫用户再次检测,——>有修改——>用户名输入框就有获得焦点与失去焦点的过程——>每次用户名输入框失去了焦点都强制flag变为0,让用户再检测。
代码:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
<script type="text/javascript" src="jslib/jquery.js">
</script>
<script type="text/javascript">
$(document).ready(function(e) {
$("input[type='text'][name='uname']").blur(function(e) {
$("input[type='hidden'][name='flg']").val(0);
});
$("#info").css("color","red");
$("input[type='button'][name='check']").click(function(e) {
if($.trim($("input[type='text'][name='uname']").val()).length==0)
{
$("#info").html("请先输入用户名");
return false;
}//把用户名传到servlet先保证不为空
$.post("CheckIt",{uname:$("input[type='text'][name='uname']").val()},function(data)
{
var s=new Array();
s=data.split("$");
$("input[type='hidden'][name='flg']").val(s[0]);
$("#info").html(s[1]);
})//传到servlet,得到返回
});
$("form[name='f1']").submit(function(e) {
if($("input[type='hidden'][name='flg']").val()==0)
{
$("#info").html("请先检查用户名");
return false;
}//一开始的flg为0,必须要检查改变flg值
//if($.trim($("input[type='text'][name='uname']").val()).length==0)
//{
// $("#info").html("请先输入用户名");
// return false;
//}
//$.ajax({async:false});
//var s=new Array();
//var tips=" ";
//$.post("CheckIt",{uname:$("input[type='text'][name='uname']").val()},function(data)
//{
//s=data.split("$");
//$("input[type='hidden'][name='flg']").val(s[0]);
//tips=s[1];
//alert(tips);//有执行
//});
//alert(tips);
if($("input[type='hidden'][name='flg']").val()==1)
{
//tips=s[1];
$("input[type='hidden'][name='flg']").val(0);
//alert(tips);
$("#info").html("用户名重复!");
return false;
}
if(($("input[type='hidden'][name='flg']").val()==2)&&($.trim($("input[type='password'][name='pwd']").val()).length==0))
{
$("#info").html("请输入密码");
$("input[type='hidden'][name='flg']").val(0);//若不想再次检查用户名就不用加
return false;
}
return true;
// if((($.trim($("input[type='password'][name='pwd']").val()).length!=0)&&($("input[type='hidden'][name='flg']").val()==2)))
//{
//$("#info").html(s[1]);
//return false;
//return false;
//return false;
//else
//{
//return true;
//}
// }
});
});
</script>
</head>
<body>
<form name="f1" action="welcom.jsp">
<input type="hidden" name="flg" value="0"/>
<table border="1">
<tr>
<td width="80">用户名</td>
<td width="94"><input type="text" name="uname"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="pwd"/></td>
</tr>
<tr>
<td><input type="button" name="check" value="检查用户名"/></td>
<td><input type="submit" value="注册"/></td>
</tr>
</table>
<div id="info"></div>
</form>
</body>
解法2:在注册按钮中,每次按注册都再一次提交都后台检测验证用户名
代码:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
<script type="text/javascript" src="jslib/jquery.js">
</script>
<script type="text/javascript">
$(document).ready(function(e) {
$("#info").css("color","red");
$("input[type='button'][name='check']").click(function(e) {
if($.trim($("input[type='text'][name='uname']").val()).length==0)
{
$("#info").html("请先输入用户名");
return false;
}//把用户名传到servlet先保证不为空
$.post("CheckIt",{uname:$("input[type='text'][name='uname']").val()},function(data)
{
var s=new Array();
s=data.split("$");
$("input[type='hidden'][name='flg']").val(s[0]);
$("#info").html(s[1]);
})//传到servlet,得到返回
});
$("form[name='f1']").submit(function(e) {
if($("input[type='hidden'][name='flg']").val()==0)
{
$("#info").html("请先检查用户名");
return false;
}//一开始的flg为0,必须要检查改变flg值
if($.trim($("input[type='text'][name='uname']").val()).length==0)
{
$("#info").html("请先输入用户名");
return false;
}
var s=new Array();
var tips="";
$.ajax({//注意一定要用这个方式传数据到后台
async:false,
url:"CheckIt",
type:"POST",
data:{uname:$("input[type='text'][name='uname']").val()},
success: function(data){
alert(data+"1");//得到数据
tips=data;
alert(tips+"2");//得到数据
}
});
alert(tips+"3");//得到数据
s=tips.split("$");
alert(s[0]+"4");
if(s[0]==1){
$("#info").html(s[1]);
return false;
}
if((s[0]==2)&&($.trim($("input[type='password'][name='pwd']").val()).length==0))
{
$("#info").html("密码不能为空");
return false;
}
return true;
});
});
</script>
</head>
<body>
<form name="f1" action="welcom.jsp">
<input type="hidden" name="flg" value="0"/>
<table border="1">
<tr>
<td width="80">用户名</td>
<td width="94"><input type="text" name="uname"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="pwd"/></td>
</tr>
<tr>
<td><input type="button" name="check" value="检查用户名"/></td>
<td><input type="submit" value="注册"/></td>
</tr>
</table>
<div id="info"></div>
</form>
</body>
从这个问题钟要认识到一个问题:
可以通过alert一步一步接近问题的根源