1.什么是过滤器?有什么用?
定义:过滤器是一个服务端的组件。它可以截取用户端的请求与响应信息,并对这些作息过滤。
2.怎么过滤?
- 工作原理
- 生命周期
实例化在web.xml中。只会实例化一次。
初始化调用init()。只会调用一次
过滤--->doFilter().有请求就会调用doFilter();
销毁--->dostroy;在服务器关闭的时候。
- 过滤器分为几种类型
- 过滤的步骤。
- 先实现Filter接口
- 在web.xml
- 过滤器链是什么?
用户请求--------->过滤器1------>filter2----->filter3----web资源 --->fitler3-->filter2--->filter1--->用户 (其中顺序是web.xml中先后定义的顺序);
- 问题
- 过滤器是否能改变用户请求的Web资源呢? 也就是能否改变用户请求的路径?
答:是可以。
- 过滤器能否直接返回数据,能不能直接处理用户请求?
答:是不可以。因为它不是一个标准的servlet。
- Web项目中多个过滤器是如何实现的?
答:建多个过滤器。
- 多个过滤器对应同一个用户路径执行的顺序如何?
- 过滤器是否能改变用户请求的Web资源呢? 也就是能否改变用户请求的路径?
3.在哪要过滤?
比如:还没有登录就直接到哪一个界面。从而会提示用户先登录。。。。
代码实现:
web.xml:
<span style="font-size:18px;"><filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.tan.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!--
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.tan.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
<filter>
<filter-name>ForwardFilter</filter-name>
<filter-class>com.tan.filter.ForwardFiler</filter-class>
</filter>
<filter-mapping>
<filter-name>ForwardFilter</filter-name>
<url-pattern>/main.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
<filter-name>IncludeFilter</filter-name>
<filter-class>com.tan.filter.IncludeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IncludeFilter</filter-name>
<url-pattern>/include.jsp</url-pattern>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
<filter-name>ErrorFilter</filter-name>
<filter-class>com.tan.filter.ErrorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ErrorFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page></span>
javaee部分:
/**
*
*/
package com.tan.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 功能:
* @author TanZi
* @time 2015-5-15上午11:02:31
*/
public class FirstFilter implements Filter {
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
* 在容器销毁时调用。。
*/
@Override
public void destroy() {
System.out.println("destroy----------FirstFilter");
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
* 这个方法完成实际的过滤操作。这个地主是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的dofilter()方法,
* FilterChain 参数可以调用chain.doFilter(),将请求会给下一个过滤器,或利用转发。重定向将请求转发到其他资源
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Start--FirstFilter----------->doFilter");
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse res=(HttpServletResponse) response;
// res.sendRedirect(req.getContextPath()+"/main.jsp");
// req.getRequestDispatcher("main.jsp").forward(req, res);
req.getRequestDispatcher("include.jsp").include(request, response);
//chain.doFilter(request, response);
//到达界面之后再运行
System.out.println("End---FirstFilter---------->doFilter");
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
* 这是过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法。这个方法中可以读取Web.xml文件中过滤器的参数
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init----------------FirstFilter");
}
}