Filter:过滤器
1,概念
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
过滤器的作用:
- 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤。。
快速入门
注意一点:Filter这里的包是javax.servlet
下的。
步骤:
1,定义一个类,实现接口Filter
2,复写方法
3,配置拦截路径
- web.xml
- 注解
通过注解配置
@WebFilter("/*") //访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1.....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
通过web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.jsp.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
过滤器的细节
1,web.xml配置
2,过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
3,过滤器生命周期方法
4,过滤器配置详解
5,过滤器链(配置多个过滤器)
过滤器执行流程
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//对request对象请求消息增强
System.out.println("filterDemo2执行了。。。。");
//放行
chain.doFilter(req, resp);
//对response对象的响应消息增强
System.out.println("filterDemo2回来了。。。。");
}
过滤器生命周期方法
@WebFilter("/*")
public class FilterDemo3 implements Filter {
/**
* 在服务器关闭后,Filter对象被销毁,如果服务器正常关闭,则会执行destroy方法
* 只执行一次
*/
public void destroy() {
System.out.println("destroy。。。。");
}
/**
* 每一次请求被拦截资源时,会执行,执行多次
* @param req
* @param resp
* @param chain
* @throws ServletException
* @throws IOException
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter。。。。");
chain.doFilter(req, resp);
}
/**
* 在服务器启动后会创建Filter对象,然后调用init方法,只执行一次
* @param config
* @throws ServletException
*/
public void init(FilterConfig config) throws ServletException {
System.out.println("init。。。。");
}
}
过滤器配置详解
1,拦截路径配置
- 具体路径资源:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录:/user/* 访问/user下所有资源时,过滤器都会被执行
- 后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
- 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
2,拦截方式配置:资源被访问的方式
- 注解配置:
- 设置dispatcherTypes属性
- 1,REQUEST:默认值。浏览器直接请求资源
- 2,FORWARD:转发访问资源
- 3,INCLUDE:包含访问资源
- 4,ERROR:错误跳转资源
- 5,ASYNC:异步访问资源
- 设置dispatcherTypes属性
- web.xml配置
- 设置
<dispatcher></dispatcher>
标签即可
- 设置
过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器(过滤器1和过滤器2)
- 1,过滤器1
- 2,过滤器2
- 3,资源执行
- 4,过滤器2
- 5,过滤器1
过滤器先后顺序问题
1,注解配置:按照类名的字符串比较规则比较,值小的先执行
- 如:AFilter 和 BFilter,AFilter就先执行了。
2,web.xml配置:<filter-mapping>
谁定义在上边,谁先执行
案例1: 登录验证 需求:
- 访问案例的资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录
/**
* 登录验证的过滤器
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//强制转换
HttpServletRequest request = (HttpServletRequest) req;
//1,获取资源请求路径
String uri = request.getRequestURI();
//2,判断是否包含登录相关资源路径,要注意排除掉css/js/图片/验证码等资源
if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/js/") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")){
//包含,用户想登录,放行
chain.doFilter(req, resp);
}else{
//不包含,需要验证用户是否登录
//3,从获取session中获取user
Object user = request.getSession().getAttribute("user");
if (user != null) {
//登录放行
chain.doFilter(req, resp);
}else{
//没有登录,跳转登录页面
request.setAttribute("login_msg","您尚未登录,请登录");
request.getRequestDispatcher("login.jsp").forward(request,resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}