-
过滤器链(Web项目支持多个过滤器)
定义:如果两个或者多个过滤器拦截的URL路径规则不同,则互不影响,如果相同,就构成了过滤器链。
过滤器链
过滤器链执行过程
问题:
1、Web项目中多个过滤器是如何实现的?
2、多个过滤器对应同一个用户路径执行顺序如何?
注意:过滤器的初始化方法是按照filter-name的字母排序的,排在后面的字母先加载初始化方法。
查看全部 -
过滤器案例
知识点1:实现过滤器功能,前提是实现javax.servlet.Filter这个接口。
知识点2:实现Filter接口的三个方法简介。
【a】init():过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法,这个方法通过方法参数FilterConfig可以读取web.xml文件中的过滤器的参数。
【b】doFilter():该方法完成实际过滤操作,过滤器的核心方法,当用户请求访问与过滤器关联的URL时,Web容器将先调用该方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求资源转发到其他资源。
【c】destory():Web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(多数情况用不到)
Web.xml中过滤器的配置(filterChain.doFilter(servletRequest, servletResponse)相当于访问目标资源)
问题环节:
【1】过滤器是否能改变用户请求的Web资源呢?也就是能否改变用户请求的路径?
答:可以,比如:登录,检测到不符合要求,则可以跳转到登陆页面。
【2】过滤器能否直接返回数据,能不能直接处理用户请求?
答:不可以,因为Filter不是标准的Servlet,不能把数据直接返回到用户请求,只能跳转到Web请求的资源,或者跳转、重定向到其他的Web资源。
查看全部 -
过滤器的工作原理和生命周期
工作原理:
生命周期:(分为4种)
【a】实例化:Web容器通过Web.xml配置,启动Web容器时会自动加载过滤器,只会实例化一次。
【b】初始化:加载一些初始化信息,调用过滤器的init()方法,进行初始化的一些相关操作,只会执行一次。
【c】过滤:调用过滤器中的doFilter()方法,执行n次的,捕获的每一个请求都会执行该方法。
【d】销毁:调用过滤器的destory()方法,当Web容器关闭时,调用该方法。
查看全部 -
Java Web过滤器简介:过滤用户请求(不符合规则的进行一定处理)。
过滤器定义:服务器端的组件(因为请求都必须要到达服务器端,然后再进行返回),可以截取用户端的请求与响应信息,并对这些信息过滤。
常用操作:
1、通过过滤器可以实现权限功能(判断是否登录状态,同一页面登录前和登录后拥有不同显示效果)。
2、当访问一个界面,结果找不到的时候,就会提示错误,可以通过过滤器做一些人性化的提示,提高用户体验。
课程目标:
一:工作原理
二:生命周期(包括哪些生命周期,以及每个生命周期都要执行哪些方法)
三:过滤器分几种类型(根据不同业务请求,有不同的过滤器)
四:登录验证及编码转换演示两个实战案例
查看全部 -
过滤器的生命周期查看全部
-
过滤器的异步处理:
查看全部 -
总结: 过滤器的生命周期: 实例化(web.xml)--〉初始化(init())--〉过滤(doFilter())--〉销毁(destory()) 1.过滤器的概念: 过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。 1.概念:过滤器是一个服务器上的组件,它可以截取用户端的请求和相应信息,并对其过滤 2.工作原理: 用户请求--〉过滤器将用户请求发送至Web资源--〉web资源--〉web响应发送至过滤器--〉过滤器--〉过滤器将web的响应返回给用户 3.过滤器的生命周期: 实例化(web.xml)--〉初始化(init())--〉过滤(doFilter())--〉销毁(destory()) 4.过滤器的API: init()、doFilter()、destory() 5.多个过滤器(过滤器链) 6.过滤器分类 7.过滤器实例:登录过滤器和编码过滤器 服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
查看全部 -
@JavaWeb----过滤器编码转换
在web.xml中配置
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.filter.LoginFilter</filter-class>
<!-- 指定部分页面,在代码中实现对这些页面放行 -->
<init-param>
<param-name>noLoginPaths</param-name>
<param-value>index.jsp;login.jsp;LoginServlet;fail.jsp</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>在Filter中
private FilterConfig config = null;public void init(FilterConfig arg0) throws ServletException {
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
config = arg0; // 将实例化时的init-param存入config
}
throws IOException, ServletException {
String charset = config.getInitParameter("charset"); // 从config中获得字符集
if(charset==null){
charset = "UTF-8";
}
request.setCharacterEncoding(charset); // 设定字符集为UTF-8
}查看全部 -
登录验证过滤器: 过滤规则:通过检查session中是否有用户信息来判断是否已经登录,登录则放行,未登录则重定向到登录页 过滤的路径: 1.简单的将要过滤的路径添加到配置文件中过(但经常会很多不推荐) 2.使用/*过滤所有,此时有一些不应过滤的路径(比如登录页本身),只能在doFilter中判断并放行.一种好的方式是:将不过滤的路径通过init-param提交,在doFilter通过循环来判断,这样只需要将不过滤的路径加到配置文件中即可 此外这一节演示了设置和读取init-param的方法
查看全部 -
根据过滤器的规则,过滤器得等servlet执行结束才能停止,所以如果servlet执行很久,过滤器得等很久,所以说呢,为了使得过滤器早点执行结束,就让servlet在后台执行,过滤器提前结束,这就是异步过滤器的优点所在
@WebServlet(asyncSupported = true, displayName = "/AsyncServlet", urlPatterns={"/servlet/AsyncServlet"})
asyncSupported = true 是必须开启用以支持异步
@WebFilter(filterName="AsynFilter",asyncSupported=true,value={"/servlet/AsyncServlet"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
asyncSupported = true 是必须开启用以支持异步
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC}
DispatcherType.REQUEST必须要加上,否则过滤器就不会生效了
同时注意在过滤的地址和servlet的地址必须相同查看全部 -
request 用户直接访问页面时(eg:请求response.sendredirect请求重定向),Web容器将会调用过滤器
forward 目标资源通过RequestDispatcher的forward访问时,该过滤器被调用 <jsp:forward也能触发
include 目标资源通过RequestDispatcher的include访问时,该过滤器被调用 <jsp:include也能触发
error 目标资源通过声明式处理机制调用时,该过滤器被调用<error-page>
<error-code>404</error-code>//500
<location>/error.jsp</location>
</error-page>
<filter>
<filter-name>ErrorFilter</filter-name>
<filter-class>com.imooc.filter.ErrorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ErrorFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
@error.jsp
您输入的路径有误!
@ErrorFilter.java
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
System.out.println("检测到有错误的信息!");
filterchain.doFilter(servletrequest, servletresponse);//注意:放行
}
Servlet3.0中加入了@引言的这种方式.
@WebFilter用来将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器.(部署理解为项目发布,就会把Web.xml文件与项目的文件读取在Web容器里,部署的时候容器就会识别注解,将相应的类部署为过滤器.启动服务器才执行过滤器的初始化方法.)
则添加过滤器不需要再web.xml中配置.直接在过滤器类里加入@WebFilter声明即可.
filter-mapping元素用来声明Web应用中的过滤器映射。过滤器可被映射到一个servlet或一个URL模式。将过滤器映射到一个servlet中会造成过滤器作用于servlet上。将过滤器映射到一个URL模式中则可以将过滤器应用于任何资源,只要该资源的URL与URL模式匹配。过滤是按照部署描述符的filter-mapping元素出现的顺序执行的。
过滤器filter-mapping的<servlet-name>标签意思是过滤器关联Servlet,当某些用户请求访问Servlet的时候,会被过滤器截取请求.(即Web容器会调用过滤器的doFilter()方法)
过滤器filter-mapping的<url-pattern>标签意思是过滤器关联的URL地址.当用户访问关联的URLWeb资源时,会被过滤器截取请求.(即Web容器会调用过滤器的doFilter()方法)
图中上部分是Servlet3.0配置过滤器的方法.下部分是Servlet2.5的配置过滤器方法查看全部 -
为什么sendRedirect会陷入死循环,而getRequestDispatcher.forward不会? 因为前者是使用的过滤器类型是request,访问index.jsp页面时,触发过滤器,重定向到main.jsp,由于过滤器类型是request,所以会继续触发main.jsp的过滤器,所以会陷入死循环。 后者在访问index.jsp的时候,过滤器类型是request,所以会触发过滤器,然后利用转发的方式访问main.jsp,这时候过滤器的类型是forward,而此时web.xml中定义的匹配main的过滤器类型还是request,所以不执行main所匹配的过滤器,因此只执行一次。
查看全部 -
Web应用允许多个过滤器来过滤页面请求——联想现实生活中的例子是最好理解的啦!比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤。 这个时候就分为两种情况了 1:多个过滤器过滤的URL不同,那么此时的多个过滤器是互不相干的,各过滤各的,互不干扰 2:多个多虑期过滤的URL相同,那么此时的多个过滤器就形成了一个过滤器链,此时就有个一个问题了Web容器现将对应的请求给谁过滤呢?处理规则也很简单,就是根据在Web.xml文件中配置的声明的顺序来决定,那个先过滤那个在过滤
查看全部 -
JAVA过滤机制——第一个过滤器案例 1、创建一个过滤器类 ,继承自servlet下的Filter 2、重写三个方法init() doFilter() destroy()方法 (1)init()初始化:这个方法可以读取web.xml文件中的过滤器初始化参数。通过参数FilterConfig arg0可以获取更多参数 (2)doFIlter()核心:完成实际的过滤操作。当用户请求访问与过滤器【关联的URL】时,Web容器将先调用过滤器的doFilter方法,FilterChain arg2参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发,重定向将请求转发给其他资源。 (3)web容器在消耗过滤器前调用该方法,用于释放过滤器占用的资源。(大多数情况用不到)
查看全部 -
一.过滤器的工作原理
用户发送请求到过滤器,过滤器将用户请求发送到web资源,web资源将响应发送到过滤器,过滤器将响应发送给用户
二.过滤器的工作周期
1.实例化阶段-->一启动服务器就会从Web容器的web.xml文件中自动去加载实例化过滤器.且只会实例化一次.即生成了过滤器. 2.初始化阶段-->生成过滤器之后便是初始化,加载一些初始化信息.调用init()方法.且只执行一次. 3.过滤阶段-->执行过滤器的doFilter()方法进行过滤.执行n次的,凡是过滤器捕获到用户的请求,都会执行这个过滤方法. 4.销毁阶段-->当Web容器关闭即服务器关闭的时候,便执行destroy()方法销毁.查看全部
举报