过滤器
1、过滤器简介
过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。
2、过滤器的工作原理和生命周期
3、第一个过滤器案例
1)创建过滤器类,实现javax.servlet.Filter接口
2)重写Filter方法
init()方法
这是过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
doFilter()方法
这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。
destroy()方法
Web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)
public class FirstFilter implements Filter {
@Override
public void destroy() {
System.out.println("destroy---FirstFilter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("start----doFilter--FirstFilter");
chain.doFilter(request, response);
System.out.println("end------doFilter--FirstFilter");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init----FirstFilter");
}
}
3)配置web.xml文件
4、过滤器链
过滤器链是指针对一个请求有多个过滤器,服务器会按照web.xml中过滤器定义的先后顺序组装成一条链。
5、过滤器分类
Servlet2.5
PEQUEST:用户直接访问页面时,Web容器将会调用过滤器;
FORWARD:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用;
INCLUDE:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用;
ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用;
Servlet3.0
ASYNC:支持异步处理;
6、过滤器应用
案例1:过滤器错误页面跳转
web.xml
404
/error.jsp
ErrorFilter
com.imooc.filter.ErrorFilter
ErrorFilter
/error.jsp
ERROR
ErrorFilter.java
public class ErrorFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
System.out.println("检测到有错误信息");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
案例2:登录时编码过滤
web.xml
LoginFilter
com.imooc.filter.LoginFilter
noLoginPaths
login.jsp;fail.jsp;LoginServlet
charset
UTF-8
LoginFilter
/*
LoginFilter.java
public class LoginFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
HttpSession session = request.getSession();
String noLoginPaths = config.getInitParameter(“noLoginPaths”);
String charset = config.getInitParameter(“charset”);
if(charset==null){
charset = “UTF-8”;
}
request.setCharacterEncoding(charset);
if(noLoginPaths!=null){
String[] strArray = noLoginPaths.split(";");
for (int i = 0; i < strArray.length; i++) {
if(strArray[i]==null || "".equals(strArray[i]))continue;
if(request.getRequestURI().indexOf(strArray[i])!=-1 ){
arg2.doFilter(arg0, arg1);
return;
}
}
}
if(session.getAttribute("username")!=null){
arg2.doFilter(arg0, arg1);
}else{
response.sendRedirect("login.jsp");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
config = arg0;
}
}
LoginServlet.java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
if(“admin”.equals(username) && “admin”.equals(password)){
//校验通过
HttpSession session = request.getSession();
session.setAttribute(“username”, username);
response.sendRedirect(request.getContextPath()+”/sucess.jsp”);
}else{
//校验失败
response.sendRedirect(request.getContextPath()+”/fail.jsp”);
}
}
案例3:Servlet3.0异步操作
web.xml
AsynServlet
com.imooc.servlet.AsynServlet
true
AsynServlet
/servlet/AsynServlet
AsynFilter.java
@WebFilter(filterName=”AsynFilter”,asyncSupported=true,
value={“/servlet/AsynServlet”},
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
public class AsynFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
System.out.println("start.....AsynFilter");
arg2.doFilter(arg0, arg1);
System.out.println("end.....AsynFilter");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
AsynServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet执行开始时间:"+new Date());
AsyncContext context = request.startAsync();
new Thread(new Executor(context)).start();
System.out.println("Servlet执行结束时间:"+new Date());
}
public class Executor implements Runnable{
private AsyncContext context;
public Executor(AsyncContext context ) {
this.context = context;
}
@Override
public void run() {
//执行相关复杂业务
try {
Thread.sleep(1000*10);
// context.getRequest();
// context.getResponse();
System.out.println(“业务执行完成时间:”+new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}