9实验九 过滤器编程实验.docx
《9实验九 过滤器编程实验.docx》由会员分享,可在线阅读,更多相关《9实验九 过滤器编程实验.docx(17页珍藏版)》请在冰点文库上搜索。
9实验九过滤器编程实验
实验九过滤器编程实验
实验目的
掌握过滤器的主要功能
掌握过滤器的编程方法
掌握过滤器的配置方法
实验内容
1、在前面实验的基础上体验过滤器功能的使用。
编写一个过滤器,用于监测用户输入的帐号和密码是否正确,如果正确则进入系统,否则重定向到登录页面。
在前面实验的基础上进行修改,登录密码验证使用过滤器实现。
2、过滤器链的使用。
在上面过滤器实现登录信息验证的基础上添加一个过滤器实现对JSP页面的过滤,将公共的Foot信息(版权、单位信息)插入到每个JSP页面中,避免每个页面重复嵌入Foot代码。
实验操作步骤
1、操作步骤
(1)新建一个WebProject,工程名为ExperiNineFilter,在WebRoot下新建一个login.jsp文件,是图书管理系统的学生或管理员的登录界面。
login.jsp中
标签部分的代码如下:
用户登录
账号:
密码:
管理员
学生
(2)将工程发布测试,输入地址http:
//localhost:
8080/ExperiNineFilter/login.jsp,可以看到如图1所示的界面。
图1登录界面
(3)下面将根据选择的是管理员还是学生,分别打开数据库bookmgs中的数据库表admin或student_info,只要界面上输入的用户账号和密码同数据库中的一致,则允许用户跳转到图书管理系统的主界面。
假设主界面只显示“欢迎您:
×××”的信息。
连接数据库进行验证的处理不在Servlet中处理,而是由过滤器处理。
将前面连接数据库处理等操作在过滤器中进行处理。
在src目录下新建一个过滤器类LoginCheckFilter,重写doFilter(),init()和destroy()方法。
过滤器类的代码如下:
packagecs.javaee;
importjava.io.IOException;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
publicclassLoginCheckFilterimplementsFilter{
Connectioncn=null;
privateStringwebroot=null;
publicvoiddestroy(){
try{
if(cn!
=null&&(!
cn.isClosed())){
cn.close();
cn=null;
}
}catch(Exceptione){
System.out.println("DestroyError:
"+e.getMessage());
}
}
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
//根据页面上选择的是管理员还是学生来选择不同的数据库表进行读取验证
HttpServletRequestrequest=(HttpServletRequest)arg0;
HttpServletResponseresponse=(HttpServletResponse)arg1;
HttpSessionsession=request.getSession(false);
Stringuri=request.getRequestURI();
StringuserID=null;
Stringpassword=null;
StringdbUserID=null;//读取数据库表中的账号
StringdbPwd=null;//读取数据库表中的密码
StringsqlStr="";//命令字符串
Statementst=null;
ResultSetrs=null;
userID=request.getParameter("name");
password=request.getParameter("pwd");
StringselectRole=request.getParameter("chkRole");
System.out.println("selectedRole:
"+selectRole);
//根据选择的是管理员还是学生来选择到不同的数据库中去查找
try{
st=cn.createStatement();
System.out.println("数据库连接成功...");
}catch(SQLExceptione1){
//TODOAuto-generatedcatchblock
System.out.println("数据库连接失败!
");
e1.printStackTrace();
}
if(selectRole.equals("admin")==true){//查找管理员的数据库表
sqlStr="select*fromadmin";
try{
rs=st.executeQuery(sqlStr);
if(rs.next()){
dbUserID=rs.getString("admin_id").toString();
System.out.println("dbUser"+dbUserID);
dbPwd=rs.getString("admin_pwd");
request.setAttribute("userID",userID);
}
if(userID.equals(dbUserID)==true
&&password.equals(dbPwd)==true){//账号和密码正确,通过
arg2.doFilter(arg0,arg1);
//return;
}else{
System.out.println("账号或密码有误!
");
response.sendRedirect("login.jsp");//账号和密码不对,重新回到登录界面
return;
}
rs.close();
st.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}elseif(selectRole.equals("student")==true){//查找学生的数据库表
sqlStr="select*fromstudent_info";
try{
rs=st.executeQuery(sqlStr);
if(rs.next()){
dbUserID=rs.getString("stu_id");
dbPwd=rs.getString("stu_pwd");
request.setAttribute("userID",userID);
}
if(userID.equals(dbUserID)==true
&&password.equals(dbPwd)==true){//账号和密码正确,通过
arg2.doFilter(arg0,arg1);
}else{
System.out.println("账号或密码有误!
");
response.sendRedirect("login.jsp");//账号和密码不对,重新回到登录界面
return;
}
rs.close();
st.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
publicvoidinit(FilterConfigarg0)throwsServletException{
ServletContextctx=arg0.getServletContext();
webroot=ctx.getContextPath();
Stringdriver=arg0.getInitParameter("driver");
Stringurl=arg0.getInitParameter("url");
Stringuser=arg0.getInitParameter("user");
Stringpassword=arg0.getInitParameter("password");
try{
Class.forName(driver);
cn=DriverManager.getConnection(url,user,password);
System.out.println("connectiondatabase...");
}catch(Exceptione){
System.out.println("初始化错误:
"+e.getMessage());
}
}
}
(4)配置过滤器,此过滤器只过滤登录处理LoginServlet,配置过滤器的web.xml文件的配置如下:
xmlversion="1.0"encoding="UTF-8"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
LoginFilter
cs.javaee.LoginCheckFilter
driver
com.mysql.jdbc.Driver
url
jdbc:
mysql:
//localhost:
3306/bookmgs
user
root
password
vip
LoginFilter
/LoginAction
ThisisthedescriptionofmyJ2EEcomponent
ThisisthedisplaynameofmyJ2EEcomponent
LoginServlet
cs.javaee.LoginServlet
LoginServlet
/LoginAction
index.jsp
BASIC
(5)在src目录下新建一个HttpServlet类LoginServlet,其主要工作是如果过滤器中得到输入的账号和密码一致,在LoginServlet中,直接显示欢迎用户的信息。
LoginServlet的配置在上面的web.xml文件中已经配置。
LoginServet中的doPost()方法的代码如下:
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
System.out.println("通过验证,然后转到主页面");
response.setContentType("text/html");
response.setCharacterEncoding("gbk");
PrintWriterout=response.getWriter();
StringuserID=(String)request.getAttribute("userID");
out.println("
DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">");
out.println("");
out.println("
图书管理系统主页");
out.println("
");
out.println("
");out.println("
图书管理系统
");
out.println("欢迎您:
");
out.println(userID);
out.println("");
out.println("");
out.flush();
out.close();
}
(6)再次测试,选择管理员用户,如图2所示,如果账号和密码不正确,重新回到登录页面,如果账号和密码正确,则转到图书管理系统的主页面,如图3所示。
图2登录用户输入信息
图3主页面
2、操作步骤
(1)一般网页底部版权等信息的添加可以采用页面组合的方式,此处使用过滤器直接添加,主要是体验过滤器链的使用。
在cs.javaee包下新建一个响应体数据包装类FootResponseWrapper,重写其中的getWriter()方法和toString()方法。
FootResponseWrapper类的代码如下:
packagecs.javaee;
importjava.io.CharArrayWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpServletResponseWrapper;
publicclassFootResponseWrapperextendsHttpServletResponseWrapper{
privateCharArrayWriterbuffer=null;
publicFootResponseWrapper(HttpServletResponseresponse){
super(response);
buffer=newCharArrayWriter();
}
@Override
publicPrintWritergetWriter()throwsIOException{
returnnewPrintWriter(buffer);
}
@Override
publicStringtoString(){
//TODOAuto-generatedmethodstub
returnbuffer.toString();
}
}
(2)定义一个过滤器类FootFilter,用于对响应的页面添加底部文本信息,FootFilter类的代码如下:
packagecs.javaee;
importjava.io.CharArrayWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletResponse;
publicclassFootFilterimplementsFilter{
privateStringfooter=null;
publicvoiddestroy(){
//TODOAuto-generatedmethodstub
}
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
//响应对象封装
FootResponseWrapperwrapper=newFootResponseWrapper((HttpServletResponse)arg1);
System.out.println("wrapper...."+wrapper.toString()+"!
");
//调用链中下一个对象
arg2.doFilter(arg0,wrapper);
//响应数据修改处理,这些处理操作要放在doFilter()方法之后
CharArrayWriteroutbuffer=newCharArrayWriter();
System.out.println("outbuffer:
"+outbuffer.toString());
Stringo