访问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个包装类:
ServletRequestWrapperServletResponseWrapperHttpServletRequestWrapperHttpServletResponseWrapper用过滤器我们可以实现:
过滤IP图片防外链(只能从自己的网站上看到正确图片,从别的网站请求看到的是不同的图片)重写一个好看的404页面,对用户友善一些这里就这些啦~