过滤器
访问Servlet之前和之后,可以增加一些我们的业务程序,就是过滤器。
执行顺序:
如何实现Filter:
- 编写Filter类实现javax.servlet.Filter接口
- 配置Filter过滤哪些Servlet
在xml配置中,哪个Filter配置在前面就先执行哪个
Xml配置:
<filter>
<filter-name>logger</filter-name>
<filter-class>com.oracle.LoggerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logger</filter-name>
<url-pattern>/admin/*</url-pattern>//意思是过滤admin文件夹下所有的页面
</filter-mapping>
也可以用Annotation配置,不过xml可以保证Filter的顺序。
@WebFilter("/admin/*")
一个简单的Filter:
package com.oracle;
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 {
FilterConfig fc;
@Override
public void destroy()
{
System.out.println("FirstFilter......destroy...........");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("FirstFilter......dofilter...........");
System.out.println("执行目标Servlet之前。。。。。。。。。。。。。。。。。");
arg2.doFilter(arg0, arg1);//把当前请求响应交给下一个目标,这里执行下一个Filter或者是目标Servlet。
System.out.println("执行目标Servlet之后。。。。。。。。。。。。。。。。。。");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("FirstFilter......init...........");
this.fc=arg0;
}
}
再写另一个过滤器。。
package com.oracle;
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.annotation.WebFilter;
//@WebFilter("/admin/*")
public class LoggerFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException
{
System.out.println("Logger....前日志。。。。。。。");
arg2.doFilter(arg0, arg1);
System.out.println("Logger....后日志...........");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
在控制台的显示:
Logger....前日志。。。。。。。
FirstFilter......dofilter...........
执行目标Servlet之前。。。。。。。。。。。。。。。。。
HelloServlet.....service......
执行目标Servlet之后。。。。。。。。。。。。。。。。。。
Logger....后日志...........
如果想重写Request和Response中的方法,那么就可以继承以下4个包装类:
- ServletRequestWrapper
- ServletResponseWrapper
- HttpServletRequestWrapper
- HttpServletResponseWrapper
用过滤器我们可以实现:
- 过滤IP
- 图片防外链(只能从自己的网站上看到正确图片,从别的网站请求看到的是不同的图片)
- 重写一个好看的404页面,对用户友善一些
这里就这些啦~