一级a做爰片官方网站,深圳网站程序开发制作,为什么明明有网却打不开网页,wordpress is_single()1 什么是过滤器 过滤器JavaWeb三大组件之一#xff0c;它与Servlet很相似#xff01;不它过滤器是用来拦截请求的#xff0c;而不是处理请求的。 当用户请求某个Servlet时#xff0c;会先执行部署在这个请求上的Filter#xff0c;如果Filter“放行”#xff0c;那么会继…1 什么是过滤器 过滤器JavaWeb三大组件之一它与Servlet很相似不它过滤器是用来拦截请求的而不是处理请求的。 当用户请求某个Servlet时会先执行部署在这个请求上的Filter如果Filter“放行”那么会继承执行用户请求的Servlet如果Filter不“放行”那么就不会执行用户请求的Servlet。 其实可以这样理解当用户请求某个Servlet时Tomcat会去执行注册在这个请求上的Filter然后是否“放行”由Filter来决定。可以理解为Filter来决定是否调用Servlet当执行完成Servlet的代码后还会执行Filter后面的代码。 其实过滤器与Servlet很相似我们回忆一下如果写的第一个Servlet应用写一个类实现Servlet接口没错写过滤器就是写一个类实现Filter接口。 public class HelloFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println(Hello Filter);}public void destroy() {}
} filterfilter-namehelloFilter/filter-namefilter-classcn.itcast.filter.HelloFilter/filter-class/filterfilter-mappingfilter-namehelloFilter/filter-nameurl-pattern/index.jsp/url-pattern/filter-mapping 过滤器的生命周期 我们已经学习过Servlet的生命周期那么Filter的生命周期也就没有什么难度了 init(FilterConfig)在服务器启动时会创建Filter实例并且每个类型的Filter只创建一个实例从此不再创建在创建完Filter实例后会马上调用init()方法完成初始化工作这个方法只会被执行一次 doFilter(ServletRequest req,ServletResponse res,FilterChain chain)这个方法会在用户每次访问“目标资源url-patternindex.jsp/url-pattern”时执行如果需要“放行”那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法如果不调用FilterChain的doFilter()方法那么目标资源将无法执行 destroy()服务器会在创建Filter对象之后把Filter放到缓存中一直使用通常不会销毁它。一般会在服务器关闭时销毁Filter对象在销毁Filter对象之前服务器会调用Filter对象的destory()方法。 FilterConfig 你已经看到了吧Filter接口中的init()方法的参数类型为FilterConfig类型。它的功能与ServletConfig相似与web.xml文件中的配置信息对应。下面是FilterConfig的功能介绍 ServletContext getServletContext()获取ServletContext的方法 String getFilterName()获取Filter的配置名称与filter-name元素对应 String getInitParameter(String name)获取Filter的初始化配置与init-param元素对应 Enumeration getInitParameterNames()获取所有初始化参数的名称。 FilterChain doFilter()方法的参数中有一个类型为FilterChain的参数它只有一个方法doFilter(ServletRequest,ServletResponse)。 前面我们说doFilter()方法的放行让请求流访问目标资源但这么说不严密其实调用该方法的意思是“我当前Filter”放行了但不代表其他人其他过滤器也放行。 也就是说一个目标资源上可能部署了多个过滤器就好比在你去北京的路上有多个打劫的匪人过滤器而其中第一伙匪人放行了但不代表第二伙匪人也放行了所以调用FilterChain类的doFilter()方法表示的是执行下一个过滤器的doFilter()方法或者是执行目标资源 如果当前过滤器是最后一个过滤器那么调用chain.doFilter()方法表示执行目标资源而不是最后一个过滤器那么chain.doFilter()表示执行下一个过滤器的doFilter()方法。 多个过滤器执行顺序 一个目标资源可以指定多个过滤器过滤器的执行顺序是在web.xml文件中的部署顺序 filterfilter-namemyFilter1/filter-namefilter-classcn.itcast.filter.MyFilter1/filter-class/filterfilter-mappingfilter-namemyFilter1/filter-nameurl-pattern/index.jsp/url-pattern/filter-mappingfilterfilter-namemyFilter2/filter-namefilter-classcn.itcast.filter.MyFilter2/filter-class/filterfilter-mappingfilter-namemyFilter2/filter-nameurl-pattern/index.jsp/url-pattern/filter-mapping public class MyFilter1 extends HttpFilter {public void doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println(filter1 start...);chain.doFilter(request, response);//放行执行MyFilter2的doFilter()方法System.out.println(filter1 end...);}
} public class MyFilter2 extends HttpFilter {public void doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println(filter2 start...);chain.doFilter(request, response);//放行执行目标资源System.out.println(filter2 end...);}
} bodyThis is my JSP page. brh1index.jsp/h1%System.out.println(index.jsp); %/body 输出结果 filter1 start... filter2 start... index.jsp 四种拦截方式 分别是REQUEST、FORWARD、INCLUDE、ERROR。 REQUEST直接访问目标资源时执行过滤器。包括在地址栏中直接访问、表单提交、超链接、重定向只要在地址栏中可以看到目标资源的路径就是REQUEST FORWARD转发访问执行过滤器。包括RequestDispatcher#forward()方法、jsp:forward标签都是转发访问 INCLUDE包含访问执行过滤器。包括RequestDispatcher#include()方法、jsp:include标签都是包含访问 ERROR当目标资源在web.xml中配置为error-page中时并且真的出现了异常转发到目标资源时会执行过滤器。 可以在filter-mapping中添加0~n个dispatcher子元素来说明当前访问的拦截方式。 filter-mappingfilter-namemyfilter/filter-nameurl-pattern/b.jsp/url-patterndispatcherREQUEST/dispatcherdispatcherFORWARD/dispatcher/filter-mappingfilter-mappingfilter-namemyfilter/filter-nameurl-pattern/b.jsp/url-pattern/filter-mappingfilter-mappingfilter-namemyfilter/filter-nameurl-pattern/b.jsp/url-patterndispatcherFORWARD/dispatcher/filter-mapping 过滤器的应用场景 过滤器的应用场景 执行目标资源之前做预处理工作例如设置编码这种试通常都会放行只是在目标资源执行之前做一些准备工作[c1] 通过条件判断是否放行例如校验当前用户是否已经登录或者用户IP是否已经被禁用 在目标资源执行后做一些后续的特殊处理工作例如把目标资源输出的数据进行处理[c2] [c1]几乎是的Sevlet中都需要写request.setCharacterEndoing() 可以把它入到一个Filter中 [c2]回程拦截 设置目标资源 在web.xml文件中部署Filter时可以通过“*”来执行目标资源 filter-mappingfilter-namemyfilter/filter-nameurl-pattern/*/url-pattern/filter-mapping 这一特性与Servlet完全相同通过这一特性我们可以在用户访问敏感资源时执行过滤器例如url-pattern/admin/*url-pattern可以把所有管理员才能访问的资源放到/admin路径下这时可以通过过滤器来校验用户身份。 还可以为filter-mapping指定目标资源为某个Servlet例如 servletservlet-namemyservlet/servlet-nameservlet-classcn.itcast.servlet.MyServlet/servlet-class/servletservlet-mappingservlet-namemyservlet/servlet-nameurl-pattern/abc/url-pattern/servlet-mappingfilterfilter-namemyfilter/filter-namefilter-classcn.itcast.filter.MyFilter/filter-class/filterfilter-mappingfilter-namemyfilter/filter-nameservlet-namemyservlet/servlet-name/filter-mapping 当用户访问http://localhost:8080/filtertest/abc时会执行名字为myservlet的Servlet这时会执行过滤器。 Filter小结 Filter的三个方法 void init(FilterConfig)在Tomcat启动时被调用 void destroy()在Tomcat关闭时被调用 void doFilter(ServletRequest,ServletResponse,FilterChain)每次有请求时都调用该方法 FilterConfig类与ServletConfig相似用来获取Filter的初始化参数 ServletContext getServletContext()获取ServletContext的方法 String getFilterName()获取Filter的配置名称 String getInitParameter(String name)获取Filter的初始化配置与init-param元素对应 Enumeration getInitParameterNames()获取所有初始化参数的名称。 FilterChain类 void doFilter(ServletRequest,ServletResponse)放行表示执行下一个过滤器或者执行目标资源。可以在调用FilterChain的doFilter()方法的前后添加语句在FilterChain的doFilter()方法之前的语句会在目标资源执行之前执行在FilterChain的doFilter()方法之后的语句会在目标资源执行之后执行。 四个拦截方式REQUEST、FORWARD、INCLUDE、ERROR默认是REQUEST方式。 REQUEST拦截直接请求方式 FORWARD拦截请求转发方式 INCLUDE拦截请求包含方式 ERROR拦截错误转发方式。 转载于:https://www.cnblogs.com/flei/p/7269913.html