第十章 过滤器
什么是过滤器:
A:过滤器是封装了某些功能的一个Servlet
B:过滤器能够在服务器接受客户端的请求之前进行预处理,也能够在服务器处理完结果之后进行后处理
C:过滤器拦截请求和响应,以便以某种方式操作正在客户机和服务器之间交换的数据
D:客户端----->(请求)过滤器------->Web服务器 或 Web服务器-->响应---->客户
E:过滤器会在客户端发送请求和服务器响应客户端"自动"被调用
为什么要使用过滤器:
提出问题
1)阻止末授权访问
2)压缩数据
结论:如果有多个JSP页面和Servlet都需要进行一个相同或相似的操作,我们可以把这个操作放到一个过滤器
如何编写过滤器
A:过滤器一般会继承HttpServlet类,并实现Filter接口
B:过滤器一定要实现Filter接口中定义的三个方法:
1)public void init(FilterConfig filterConfig) throws ServletException //初始化
其中的FilterConfig参数用来读取过滤器的配置信息,如果过滤处理过程中
不汲及到读取配置信息,则可以不使用这个参数
2)public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) //执行
3)public void destroy()//销毁
C:doFilter中的ServletRequest表示请求,ServletResponse表示响应。
HttpServletRequest是ServletRequest的子类,HttpServletResponse是
ServletResponse它的子类,为了得到更多的方法一般需要向子类进行转换
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
在doFilter中进行程序处理之后,一定要调用filterChain.doFilter(request,response);
来执行过滤器(**************)
过滤器的生命周期
实例化--->初始化(去执行init方法)----->过滤(执行doFilter方法)--->销毁(执行destroy()方法)
过滤器编写配置信息
1)过滤器只要经过配置之后,才能使用。
2)在web.xml中进行配置
3)语法格式:
<filter> //用来描述过滤器
<filter-name>loginfilter</filter-name>
<filter-class>tagapp.loginFilter</filter-class>
</filter>
<filter-mapping> //过滤器的映射关系配置
<filter-name>loginfilter</filter-name>
<url-pattern>/*</url-pattern> (表示所有页面都要经过过滤器过滤
</filter-mapping>
4)这些都是Jbulider自动生成的,但是要有所了解
过滤器的应用举例
说明:编写过滤器一定要搞清楚,不过滤的和过滤的页面
1)编写一个过滤器用来限制用户末登录就使用其页面
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
HttpSession session=req.getSession();
String url=req.getRequestURI();
if (session.getAttribute("isLogin")==null && !url.endsWith("login.jsp") && !url.endsWith("check.jsp") ) //说明没有登录
{
res.sendRedirect("login.jsp");
}
filterChain.doFilter(request,response);
2)使用过滤器限制客户访问游戏网站的时间
HttpServletResponse res = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
Date demo = new Date();
int save = demo.getHours();
String url=req.getRequestURI();
if (!(save >= 8 && save <= 18) && !url.endsWith("error.jsp")) {
res.sendRedirect("error.jsp");
}
filterChain.doFilter(request,response);
3)改进第2例中,使用参数配置来决定限制的时间段
A:设置参数
<filter>
<filter-name>limitfilter</filter-name>
<filter-class>tagapp.limitFilter</filter-class>
<init-param>
<param-name>starttime</param-name>
<param-value>8</param-value>
</init-param>
</filter>
B:读取参数
this.filterConfig.getInitParameter("starttime")
4)通过过滤器来解决从表单提交数据写入数据库中的乱码
正确情况下,如果从表单提交过来的数据是汉字,则会出现乱码。但是
可以通过request.setCharacterEncoding("GBK")来设置,但是每一个
页面都来设置很复杂,于是可以通过过滤器来实现
request.setCharacterEncoding("GBK");
filterChain.doFilter(request,response);
评论