一. 简介
- 过滤器是一个服务器端的组件,可以截取用户端的请求与响应信息,并对这些信息过滤。
- 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
二. 工作原理
三. 生命周期
1)在web容器启动时依据web.xml实例化 一次
2)初始化 init() 一次
3)过滤 doFilter() 多次
4)销毁 destroy() 一次 web容器关闭
四. 多个过滤器
Web应用允许多个过滤器来过滤页面请求——联想现实生活中的例子,比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤,这个时候分为两种情况
1:多个过滤器过滤的URL不同,那么此时的多个过滤器是互不相干的,各过滤各的,互不干扰
2:多个多虑期过滤的URL相同,那么此时的多个过滤器就形成了一个过滤器链,此时就有个一个问题了Web容器现将对应的请求给谁过滤呢?处理规则也很简单,就是根据在Web.xml文件中配置的声明的顺序来决定哪个先过滤哪个再过滤
五. 过滤器的分类
六. 用户登录过滤
需求:登陆成功跳转到success.jsp页面,失败则跳转到failure.jsp页面。需要保证无法通过直接输入success.jsp页面的路径访问,自动跳转到登陆页面index.jsp。
分析:可通过过滤器进行过滤,事实上需要屏蔽的路径是success.jsp;但如果需要屏蔽的路径非常多,我们可以屏蔽所有路径,然后在过滤器里面判断是否为个例。为了方便以后修改要屏蔽的路径,可以将这些路径作为过滤器的初始化参数写在web.xml中,在过滤器里里面再获取
1.. servlet-处理用户请求
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
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("../success.jsp");
}else{
//校验失败
response.sendRedirect("../failure.jsp");
}
}
}
2.. 配置过滤器的web.xml参数
<filter> <!-- 指定一个过滤器 -->
<filter-name>LoginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
<init-param> <!--为过滤器指定初始化参数 -->
<param-name>noFilterPaths</param-name>
<param-value>index.jsp;failure.jsp;LoginServlet</param-value>
</init-param>
</filter>
<filter-mapping> <!-- 设置一个 Filter 所负责拦截的资源 -->
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 设置 filter 所拦截的请求路径(过滤器关联的URL样式) -->
<dispatcher>REQUEST</dispatcher> <!-- 指定过滤器所拦截的资源被 Servlet 容器调用的方式 -->
</filter-mapping>
3..过滤器-拦截请求
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter{
private FilterConfig config; //定义全局的config变量
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request; //强制类型转换
HttpServletResponse res = (HttpServletResponse) response;
String noFilterPaths = config.getInitParameter("noFilterPaths"); //获取web.xml中配置的初始化参数
if(noFilterPaths!=null){
String[] noFilter = noFilterPaths.split(";");
for (String path : noFilter) {
if(path==null || "".equals(path))
continue;
if(req.getRequestURI().indexOf(path)!=-1 ){ //匹配到不需要过滤的路径
chain.doFilter(request, response); //允许放行
return;
}
}
}
HttpSession session = req.getSession();
if(session.getAttribute("username")!=null){
chain.doFilter(request, response); //允许放行
}else{
res.sendRedirect("index.jsp");
}
}
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig; //获取到config对象
}
}