版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/82347601
特此说明:本文参考传智播客、黑马程序员视频讲座 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Filter快速入门
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理
package filter;
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 FilterDemo1 implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("I am Filter...");
}
public void destroy() {
// TODO Auto-generated method stub
}
}
web.xml配置:
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<!-- 下面配置的意思是拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
书写一个servlet,并通过浏览器访问:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello, Filter...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
访问结果:
控制台打印:I am Filter…
Servlet1中的doGet方法并不会打印Hello, Filter…
过滤器没有对Servlet1放行!!!
在FilterDemo1的doFilter方法中增加代码chain.doFilter(request, response);
把Servlet1放行,这时就会打印出Hello, Filter…
如果创建多个Filter,都配置拦截所有请求,那么一个请求被第一个Filter拦截后,继续被第二个Filter拦截!!Tomcat引擎创建的request和response依次传递给Filter的request和response参数,如果放行会传递给chain.doFilter的参数,再传递给Servlet的参数!!!
Filter的API
Filter对象的生命周期:
- Filter何时创建:服务器启动时就创建该filter对象
- Filter何时销毁:服务器关闭时filter销毁
public class FilterDemo1 implements Filter{
//Filter创建的时候执行init方法
public void init(FilterConfig filterConfig) throws ServletException {
//filterConfig对象可以获得一些信息
System.out.println(filterConfig.getFilterName());
//下面这个需要自己提前配置参数
// <filter>
// <filter-name>FilterDemo1</filter-name>
// <filter-class>filter.FilterDemo1</filter-class>
// <init-param>
// <param-name>aaa</param-name>
// <param-value>AAA</param-value>
// </init-param>
// </filter>
System.out.println(filterConfig.getInitParameter("aaa"));
//下面这个说明Filter对象后于ServletContext对象创建
System.out.println(filterConfig.getServletContext());
System.out.println("Filter init...");
}
//下面的request是ServletRequest类型的,如果需要HttpServletRequest的方法,可以强转,response同
//FilterChian:过滤器链对象,他知道所有Filter的顺序,通过chain.doFilter(request,response)进行放行
//注意执行Filter的顺序是根据配置的<filter-mapping>的先后顺序进行的
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter running...");
}
//Filter销毁的时候执行的方法
public void destroy() {
System.out.println("Filter destroy...");
}
}
Filter的配置
- 1)完全匹配 /sertvle1
- 2)目录匹配 /aaa/bbb/* —-最多的
/user/*:访问前台的资源进入此过滤器
/admin/*:访问后台的资源时执行此过滤器
- 3)扩展名匹配 .abc .jsp
注意:url-pattern可以使用servlet-name替代,也可以混用
<dispatcher></dispatcher>配置
dispatcher:访问的方式(了解)
REQUEST:默认值,代表直接访问某个资源时执行filter
FORWARD:转发时才执行filter
INCLUDE: 包含资源时执行filter
ERROR:发生错误时进行跳转时执行filter
应用(略)
自动登录
解决全局乱码