第七章 过滤器java
JAVAWEB三大组件:Servlet、Filter、Listenerweb
7.1 概念服务器
7.1.1 描述app
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。jsp
它可让请求获得目标资源,也能够不让请求达到!ide
过滤器有拦截请求的能力!编码
过滤器是一个服务器端的组件,它能够拦截客户端的请求和响应信息,并对这些信息进行过滤。url
Servlet API中提供了一个Filter接口,若是编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码以下:spa
7.1.2 生命周期.net
7.2 应用场景
7.3 快速上手
package javax.servlet; import java.io.IOException; public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException; public void destroy(); }1234567
init():初始化方法,建立以后立刻执行,Filter会在服务器启动时建立!
destory():销毁方法,销毁以前执行!在服务器关闭的时候销毁!
doFilter(ServletRequest,ServletResponse,FilterChain):每次过滤的时候都会执行,重点就是执行过滤的方法。
如何上手:
1.写一个类实现Filter接口,这个和Servlet是同样的。
public class AFilter implements Filter { public void destroy() { System.out.println("销毁了"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("过滤..."); //chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { System.out.println("初始化..."); } }1234567891011121314
2.在web.xml中进行配置;
<!--在web.xml配置Filter,和Servlet相似 /:表示当前web目录, *:表示全部文件; --> <filter> <filter-name>AFilter</filter-name> <filter-class>com.tea.filter.AFilter</filter-class> </filter> <filter-mapping> <filter-name>AFilter</filter-name> <url-pattern>/index.jsp</url-pattern> <!--*:过滤全部; /index.jsp:只过滤index.jsp页面。 对于其余页面放行。 --> </filter-mapping>12345678910111213141516
使用注解来建立Filter,这个是你们要掌握的知识点。
@WebFilter("/index.jsp") public class TestFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { } public void init(FilterConfig config) throws ServletException { } }1234567891011
经常使用配置项
urlPatterns
配置要拦截的资源
7.4 多个Filter的执行顺序
在咱们的请求到达Servle之间是能够通过多个Filter的,通常来讲,建议Filter之间不要有关联,各自处理各自的逻辑便可。这样,咱们也无需关心执行顺序问题。
若是必定要确保执行顺序,就要对配置进行修改了,执行顺序以下
在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行 若是既有在web.xml中声明的Filter,也有经过注解配置的Filter,那么会优先执行web.xml中配置的Filter123
总结:
1.了解Filter的概念,做用
2.Servlet和Filter的区别(相同点和不一样点)
3.了解如何使用web.xml来建立Filter,不用掌握
4.掌握使用WebFilter注解的方式来建立Filter
5.掌握过滤拦截资源的4种方式中:/* /*.jsp /xxx.jsp便可,使用可以建立案例便可。
7.5 案例展现
7.5.1 字符集编码过滤器
@WebFilter("/*") public class EncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }12345678910111213141516
7.5.2 登陆过滤器
URI和URL:
咱们目前只须要根据/后的路径来判断便可,不用关注于WEB服务器的路径,因此目前只用URI便可。
package com.aaa.filter; import com.aaa.entity.User; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; /** * Created by 张晨光 on 2020/4/24 16:04 * 过滤全部/* */ @WebFilter("/*") public class LoginFilter implements Filter { public void destroy() { } //最简单的登陆过滤的思路; //复习:过滤器里面参数:ServletRequest //HttpServletRequest:继承自ServletRequest //利用两个增长的方法:getRequestURI() getRequestURL() public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //1.将ServletRequest转型为HttpServletRequest; HttpServletRequest request= (HttpServletRequest) req; //HttpServletResponse response= (HttpServletResponse) resp; //2.获取地址栏的资源路径; String uri = request.getRequestURI(); // StringBuffer url = request.getRequestURL(); // // System.out.println(uri); // System.out.println("url:"+url); //3.判断一下资源路径是不是要登陆的路径; //若是/后是login.jsp或者是loginServlet均可以放行; if(uri.contains("login.jsp")||uri.contains("loginServlet")){ //放行,就去下一个过滤器; chain.doFilter(req,resp); }else{ User user = (User) request.getSession().getAttribute("user");//必定要和loginServlet里面设置值的时候一致; //上面的代码不转换也能够Object user=... if(user!=null){ //就是已经登陆了,继续放行; chain.doFilter(req,resp); }else{ //1.你们若是须要用resp做一下重定向,则须要在上面加代码; // response.sendRedirect("login.jsp"); //2.若是不想写1种方法的实现,则可使用 request.getRequestDispatcher("/login.jsp").forward(req,resp); } } } public void init(FilterConfig config) throws ServletException { } }1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859