1.过滤器的作用
Filter的作用:过滤器处于客户端和服务器端资源之间,对所有的请求或者响应进行拦截操作
一般用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤
2.快速入门步骤
-
定义一个类,实现接口Filter
-
复写方法
-
配置拦截路径
-
web.xml
-
注解
-
-
代码
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*")//访问所有资源之前,都会执行该过滤器 public class FilterDemo 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("过滤器被执行了"); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
3.过滤器细节
-
web.xml配置
<filter> <filter-name>demo1</filter-name> <filter-class>com.xszx.filter.FilterDemo</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!--拦截路径--> <url-pattern>/*</url-pattern> </filter-mapping>
-
过滤器执行流程
-
执行过滤器
-
执行放行后的资源
-
回来执行过滤器放行代码下边的代码
-
-
过滤器声明周期方法
-
init:在服务器启动后,会创建Filter对象,然后调用init方法,只执行一次,用于加载资源
-
doFilter:每一次请求被拦截资源时,会执行,执行多次
-
destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法,只执行一次。
-
-
过滤器配置详解
-
拦截路径配置
-
具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
-
拦截目录:/user/* 访问/uesr下的所有资源时,过滤器都会被执行
-
后缀名:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
-
拦截所有资源: /* 访问所有资源时,过滤器都会被执行
-
-
拦截方式配置:资源被访问的方式
-
注解配置
-
设置dispatcherType属性
-
REQUEST:默认值。浏览器直接请求资源
//浏览器直接请求index.jsp资源时,该过滤器会被执行 @WebServlet(value="/index.jsp",dispatcherType=DispatcherType.REQUEST)
-
FORWARD:转发访问资源
//只有转发访问index.jsp时,该过滤器才会被执行 @WebServlet(value="/index.jsp",dispatcherType=DispatcherType.FORWARD)
-
INCLUDE:包含访问资源
-
ERROR:错误跳转资源
-
ASYNC:异步访问资源
-
-
-
web.xml配置
设置<dispatcher></dispatcher>标签即可
<filter> <filter-name>demo1</filter-name> <filter-class>com.xszx.filter.FilterDemo</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!--拦截路径--> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
-
-
-
过滤器链(配置多个过滤器)
-
执行顺序:如果有两个过滤器:过滤器1和过滤器2
过滤器1——>过滤器2——>资源执行——>过滤器2——>过滤器1
-
过滤器先后顺序问题“
-
注解配置:按照类名的字符串比较规则比较,值小的先执行,如:AFilter和BFilter,AFilter就先执行了
-
web.xml配置:<filter-mapping>谁定义在上边,谁先执行
-
-
-
4.登录过滤案例
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//强转
HttpServletRequest request= (HttpServletRequest) servletRequest;
//获取资源请求路径
String uri=request.getRequestURI();
//判断是否包含登录相关资源路径,注意排除css/js/图片资源
if (uri.contains("/login.jsp")||uri.contains("/loginServlet")){
//包含,放行
filterChain.doFilter(servletRequest,servletResponse);
}else{
//不包含,验证用户是否登录,从session中获取user
Object user = request.getSession().getAttribute("user");
if(user!=null){
filterChain.doFilter(servletRequest,servletResponse);
}else{
//没有登录,跳转登录页面
request.getRequestDispatcher("/login.jsp").forward(request,servletResponse);
}
}
}
@Override
public void destroy() {
}
}