1、课程名称:过滤器
过滤器的配置及使用
2、知识点
2.1、上次课程的主要知识点
1、 数据源的配置及使用
2.2、本次预计讲解的知识点
1、 过滤器的基本组成结构
2、 过滤器的主要作用
3、具体内容
JSP可以完成的功能Servlet都可以完成,但是Servlet拥有比JSP更多的功能。
Servlet按功能划分分为以下几种:
• 简单Servlet:与JSP功能类似,结合JSP,完成MVC设计模式,是整个程序中密不可分的一部分,整个程序不能分开。
• 过滤器:是作为一个单独的组件配置到WEB项目之中的
• 监听器:是作为一个单独的组件配置到WEB项目之中的
过滤器是属于自动运行的组件,顾虑器通常在以下几个地方使用:
• 对统一的编码过滤。
• 对登陆进行过滤。
如果要开发一个过滤器,则只要一个类实现javax.servlet.Filter接口即可。
FirstFilter.java:
package org.lxh.demo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FirstFilter implements Filter {
public void destroy() {
System.out.println("**** 过滤器销毁") ;
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("**** 做过滤") ;
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("**** 过滤器初始化") ;
}
}
既然过滤器是一个Servlet,所以就必须在web.xml中进行配置。
web.xml:
<filter>
<filter-name>first</filter-name>
<filter-class>org.lxh.demo.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
通过运行,可以发现,服务器启动的时候过滤器会被自动初始化。
doFilter方法:
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("**** 做过滤") ;
}
参数之中存在一个FilterChain(过滤链)。
过滤器一般要执行两次,进去的时候过滤,出来的时候再过滤。
之前在web.xml中配置的<url-pattern>实际上表示的是对那个页面进行过滤,如果是“/*”表示对所有页面进行过滤。
过滤器可以对统一的编码进行过滤。例如,现在有如下两个简单的页面。
input.htm:
<html>
<head>
<title>input.htm</title>
</head>
<body>
<form action="input.jsp" method="post">
请输入内容:<input type="text" name="info">
<input type="submit" value="提交">
</form>
</body>
</html>
input.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>
<body>
<h1>
${param.info}
</h1>
</body>
</html>
一旦此时提交的是中文,则一定出现乱码,那么此时就可以通过过滤器完成统一编码的设置。
EncodingFilter.java:
package org.lxh.demo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
private String charSet = null ;
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg0.setCharacterEncoding(this.charSet) ;
// 表示把请求向下继续传递
arg2.doFilter(arg0, arg1) ;
}
public void init(FilterConfig arg0) throws ServletException {
this.charSet = arg0.getInitParameter("charset") ;
}
}
通过web.xml进行初始化参数的配置。
web.xml:
<filter>
<filter-name>first</filter-name>
<filter-class>org.lxh.demo.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在操作中经常性的要对用户是否登陆进行验证,那么如果要进行验证的话,则肯定有大量的代码要不断的判断session是否存在。那么此种代码实际上就可以直接放在过滤器中进行编写。
LoginFilter.java:
package org.lxh.demo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) arg0;
HttpSession ses = req.getSession();
if (ses.getAttribute("info") != null) {
// 如果现在存在了session,则请求向下继续传递
arg2.doFilter(arg0, arg1);
} else {
// 跳转到登陆页面
arg0.getRequestDispatcher("forward.htm").forward(arg0, arg1) ;
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
以上的过滤器实际上针对的是jsp文件夹下的所有页面,所以映射路径应该配置在jsp/*下。
web.xml:
<filter>
<filter-name>login</filter-name>
<filter-class>org.lxh.demo.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
在需要被过滤器过滤的所有文件夹之中,加入以下的页面。
forward.htm:
<META HTTP-EQUIV="refresh" CONTENT="2;URL=../input.htm">
<center>
<h2>您还未登陆,请先登陆!</h2>
<h2>两秒后跳转到登陆页,如果没有跳转,请按<a href="../input.htm">这里</a>!</h2>
</center>
4、总结
编码过滤,和登陆过滤是两个最常用的功能
所有的过滤器都属于自动执行






