JAVAWEB学习笔记--过滤器filter

过滤器:Filter和Servlet是一样的都是单例的!

他会在一组资源(如jsp、servlet、.css、.html等)的前面执行。可以让请求得到目标资源,也可以不让请求达到。

过滤器有拦截请求的能力。

Filter接口:

void init(FilterConfig)    创建之后马上执行,Filter会在服务器启动时就创建

void destory()     销毁之前执行,会在服务器关闭时销毁

void doFilter(ServletRequest,ServletResponse,FilterChain)    每次过滤时都会执行


在web.xml中配置:可以通过“*”来执行目标资源:

(和Servlet的配置很像)

<filter>
  <filter-name>AFilter.java</filter-name>
  <filter-class>rhh.TestFilter.AFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>AFilter.java</filter-name>

  <url-pattern>/*</url-pattern>  <--表示过滤所有资源-->

  </filter-mapping>


FilterConfig(和ServletConfig相似):

FilterConfg    ServletConfig
getFilterName() getServletName()
getInitParameter(String name) getInitParameter(String name)
getInitParameterNames() getInitParameterNames()
getServletContext():获取application getServletContext():获取application

FilterChain:

    doFilter(ServletResquest, ServletResponse):放行,相当于调用了目标Servlet的 service()方法!

    执行目标资源,或是执行下一个过滤器,若没有下一个过滤器那么执行的是目标资源,若有,则执行的是下一个过滤器


过滤器的四种拦截方法:在web.xml文件中的<filter-mapping></filter-mapping>中配置

1.拦请求 REQUEST

<dispatcher>REQUEST</dispatcher>

2.拦转发  FORWARD

<dispatcher>FORWARD</dispatcher>

3.拦包含  INCLUDE

<dispatcher>INCLUDE</dispatcher>

4.拦错误  ERROR

<dispatcher>ERROR</dispatcher>

若这四个都没有配置,则默认拦截的是request


Filter的执行顺序是按在xml文件中<mapping>里的位置的顺序执行的,靠前的先执行。


过滤器的应用场景:

执行目标资源之前做预处理工作,例如设置编码(几乎所有的Servlet都需要写request.getCharacterEncodin(),可以把它们放入一个Filter中),这种尝试一般都会被放行。

通过条件判断是否放行,例如校验当前用户是否已经登录或当前用户ID是否禁用。

在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理。(回程拦截)

还可以为<filter-mappng>指定目标资源为某个Servlet,例如:

<filter-mapping>

    <filter-name>filterName</filter-name>

    <servlet-name>ServletNames</servlet-name>    <--指定一个或多个Servlet拦截-->

</filter-mapping>

这里没有绑定<url-pattern>而是<servlet-name>!

猜你喜欢

转载自blog.csdn.net/Rhhboring/article/details/80722451
今日推荐