1 什么是Filter过滤器
- Filter过滤器它是
JavaWeb
的三大组件之一(Servlet
程序,Listenter
监听器,Filter
过滤器) Filter
过滤器它是JavaEE
的规范Filter
作用:拦截请求(主要应用),过滤响应
拦截请求
权限检查
日记操作
事务管理
······
2 Filter初体验
要求:在web工程下,有一个admin
目录,这个admin
目录下的所有资源(html,jsp,jpg
等)都必须是用户登录之后才允许访问的
实现权限检查
1 编写一个类去实现Filter接口
public class AdminFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } //专门用来拦截请求,权限检查 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } }
2 实现过滤方法
doFilter
//专门用来拦截请求,权限检查 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpSession session = httpServletRequest.getSession(); Object user = session.getAttribute("user"); //如果等于null,说明还没有登录 if (user == null){ //请求转发 servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse); return; }else{ //让程序继续往下访问用户目标资源 filterChain.doFilter(servletRequest,servletResponse); } }
3 配置
web.xml
文件,配置拦截路径<!--filter标签用来配置一个Filter过滤器--> <filter> <!--给filter起一个别名--> <filter-name>AdminFilter</filter-name> <!--配置filter的全类名--> <filter-class>com.gw.filter.AdminFilter</filter-class> </filter> <!--配置filter过滤器的拦截路径--> <filter-mapping> <!--表示当前拦截路径给哪个filter使用--> <filter-name>AdminFilter</filter-name> <!--url-pattern 配置拦截路径--> <!-- / 表示请求地址为: http://ip:port/工程路径/ (web目录) --> <!--/admin/* 表示请求地址为:http://ip:port/工程路径/admin/* (*表示目录下所有文件)--> <url-pattern>/admin/*</url-pattern> </filter-mapping>
此时因为还没有用户登录的信息,我们访问admin
目录下的资源文件时会自动转发到登录页面,实现了权限检查
完整的用户登录和权限检查
模拟有用户登录信息的时候
完善
login.jsp
<body> 这是登录页面,login.jsp <form action="http://localhost:8080/15_filter/loginServlet" method="get"><br> 用户名: <input type="text" name="username"><br> 密 码: <input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body>
添加
LoginServlet
程序public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); if ("abc123".equals(username) && "123456".equals(password)){ request.getSession().setAttribute("user",username); response.getWriter().write("登陆成功"); }else{ request.getRequestDispatcher("/login.jsp").forward(request,response); } } }
web.xml
配置LoginServlet
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.gw.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
当用户登录成功,我们再次访问admin
目录下的资源文件时,就可以访问到了
3 Filter生命周期
-
构造器方法
public AdminFilter(){ System.out.println("构造器方法"); }
-
init
初始化方法@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化方法"); }
上面两个方法在web工程启动时执行
-
doFilter
过滤方法public void doFilter
每次拦截到请求时执行
-
destroy
方法@Override public void destroy() { System.out.println("销毁方法"); }
停止web工程的时候,就会执行(也会销毁Filter过滤器)
4 FilterConfig
类
Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig
类,这里包含了配置文件的配置信息
FilterConfig
类的作用就是获取filter过滤器的配置内容
- 获取Filter的名称 filter-name 的内容
- 获取在Filter 中配置的
init-param
初始化参数- 获取
ServletContext
对象
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// System.out.println("初始化方法");
//1 获取Filter的名称 filter-name 的内容
System.out.println("filter-name:" +filterConfig.getFilterName());
// 2 获取在Filter 中配置的 `init-param`初始化参数
System.out.println("初始化参数:username:"+filterConfig.getInitParameter("username"));
System.out.println("初始化参数:url:"+ filterConfig.getInitParameter("url"));
// 3 获取`ServletContext`对象
System.out.println(filterConfig.getServletContext());
}
5 FilterChain
多个过滤器执行的细节
-
多个Filter过滤器执行的时候,它们的优先顺序是由它们在
web.xml
文件配置的顺序决定的 -
filterChain.doFilter()
是继续执行请求资源文件的请求,也就会跳转到下一个Filter过滤器(由外到内),当访问到资源文件之后,就会(由内到外)的执行各个Filter过滤器的后置代码
6 Filter拦截路径
-
精确匹配(精确到一个文件)
<url-pattern>/target.jsp</url-pattern>
http://ip:port/工程路径/target.jsp
-
目录匹配(匹配一个目录下的文件)
<url-pattern>/admin/*</url-pattern>
http://ip:port/工程路径/admin/*
-
后缀名匹配
<url-pattern>*.html</url-pattern>
表示请求地址必须为.html结尾才会拦截
注意
<url-pattern>*.abc</url-pattern>
-
只要是以配置的类型结尾就行,不需要是这种类型一定的存在的,我们在地址栏请求时只要是配置的类型就可以
-
不能以 / 打头
-
Filter过滤器它只关心请求的地址是否存在,不关心请求的资源是否存在
-