过滤器可以对访问的静态资源和动态资源进行过滤,既可以过滤请求,也可以过滤响应
先创建实现类,来实现 javax.servlet.Filter包的接口,实现后有以下几个抽象方法
方法 | 说明 |
---|---|
void init(FilterConfig filterConfig) | 过滤器对象创建的时候调用的方法 |
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) | 执行的过滤方法,每次访问的拦截的资源,都会执行该方法 |
void destory() | 过滤器销毁的时候调用的方法 |
补充 doFilter成员参数 |
配置 Filter ,有两种方式,第一种是xml,第二种是注解,重点讲注解
在web资源路径下,有一个web.xml ,在里面配置以下标签
<filter>
<filter-name>自定义过滤器名称filter-name>
<filter-class>实现了过滤器的实现类路径filter-class>
filter>
<filter-mapping>
<filter-name>配置filter标签定义的过滤器名称filter-name>
<url-pattern>要进行过滤的资源地址url-pattern>
filter-mapping>
3.底层实现
使用注解开发就不需要配置xml了,只需要在对应的过滤器实现类顶部,使用
@WebFilter("/过滤的资源路径")
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
import javax.servlet.annotation.WebFilter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/${Entity_Name}")
public class ${Class_Name} implements javax.servlet.Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//放行
chain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
}
}
用户访问指定的资源路径,过滤器进行过滤
@WebFilter("/index.html")
用户访问指定目录下所有资源的时候,过滤器进行拦截
@WebFilter("/user/*")
用户访问指定后缀名的资源的时候,过滤器进行拦截,不能加/
@WebFilter("*.html")
用户访问所有资源的时候,过滤器进行拦截
@WebFilter("*")
当多个过滤器对象都指定了一个资源,那会执行所有满足条件的过滤器
指的是当前路径指定了多个过滤器,他们会像一条链子一样组合起来
如果其中一个没有放行,那就不会执行到下一个过滤器
小结:
1.前提条件:多个过滤器在同一个包下过滤器统一资源有如下过滤(注解开发)
在以前,都是在每个请求和响应中书写以下代码来处理编码问题,所以相冗余
response.setContentType("text/html;charset=utf-8");
所以有了新方案,以后这些代码就书写在过滤器中,均写在doFilter中
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//放行
chain.doFilter(servletRequest, servletResponse);
在Servlet中 无论传入啥,直接封装到对象存session
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
response.setContentType("text/html;charset=utf-8");
// 模拟使用数据库查询后
if (username.equals("admin") && password.equals("123")){
System.out.println("登入成功");
HttpSession session = request.getSession();
session.setAttribute("u",new User(username,password));
response.sendRedirect("/hack.html");
}
}
在Filter中
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
User user = (User)session.getAttribute("u");
if (user!=null) chain.doFilter(servletRequest, servletResponse);
else response.sendRedirect("/login.html");
如果不等于null,就放行,不然就重定向回登入页面