Servlet 过滤器Filter

过滤器概念

过滤器就是用来拦截客户端(浏览器)与目标资源的请求,对客户端的请求进行一定过滤处理,再发给目标资源(ServletJSPhtml等)

在Web应用程序中,过滤器是介于Servlet之前,既可以拦截、过滤浏览器的请求,也可以改变对浏览器的响应。它在服务端与客户端起到一个中间组件的作用,对二者之间的数据信息进行过滤。


一个Web应用程序中可以有多个过滤器,组成过滤器链。

过滤器链中的每个过滤器都各司其职地处理并转发数据。


在Web开发中,经常利用过滤器来实现如下功能:

 对用户请求进行身份认证;

 对用户发送的数据进行过滤或者替换;

 转换图像的数据格式;

 数据压缩;

 数据加密;

 XML数据的转换;

 修改请求数据的字符集。

Servlet过滤器的用途:

用户认证与授权管理:我们开发一个web应用,肯定有不同权限的用户,有管理员,有普通用户。而管理员又可能分为一级管理员,二级管理员,三级管理员。每一级管理员可能又有不同的管理权限操作,访问不同的资源。过去我们可能都是在jsp页面,servlet中加以权限的控制。通过session,看他是否有这个权限,如果有,则让他操作某个资源。这些都是些共性。那么现在我们就可以把他提取出来。让他通过过滤器来实现;用户来访问一个资源,我们通过过滤器来过滤这个请求,在程序中判断是否有权限来访问这个资源;有,则让他去访问,没有,就让他转到另外一个页面。这样通过过滤器就实现了授权管理;

 实现过滤器

1.创建Class类,并实现Filter接口(javax.servlet.Filter)。

2.重写Filter接口中的方法:

Public void init(FilterConfig filterConfig){

    // 该方法用来初始化过滤器,FilterConfig对象可以得到过滤器中初始化的配置参数信息

}

Public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){

    // 该方法主要实现过滤的方法。当客户端请求目标资源时会调用此方法,在该方法中,实现对请求(request)和响应(response)的数据处理,chain是过滤器链对象。在该方法中的特定操作完成后,可调用FilterChain对象的doFilter(request, response)将请求传递给下一个过滤器或目标资源。

}

Public void destroy(){

    // 该方法用于释放过滤器中使用的资源。

}


3.在web.xml中配置Filter

<filter>

    <filter-name>filter1</filter-name>

    <filter-class>com.filter.ServletFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>filter1</filter-name>

<!--当请求/manage/目录下的资源时执行过滤器-->

    <url-pattern>/manage/*</url-pattern>

</filter-mapping>

实现过滤器链

在访问目标资源时执行多个过滤器。

例:访问/manage/下所有目标资源时会执行过滤器filter1filter2

<!--第一个过滤器-->

<filter>

    <filter-name>filter1</filter-name>

    <filter-class>com.filter.SerlvetFilterA</filter-class>

</filter>

<filter-mapping>

    <filter-name>filter1</filter-name>

    <url-pattern>/manage/*</url-pattern>

</filter-mapping>

<!--第二个过滤器-->

<filter>

    <filter-name>filter2</filter-name>

    <filter-class>com.filter.ServletFilterB</filter-class>

</filter>

<filter-mapping>

    <filter-name>filter2</filter-name>

    <url-pattern>/manage/*</url-pattern>

</filter-mapping>

注意事项:

过滤链的执行顺序由 web.xml中定义的顺序决定

l 一旦形成过滤链的,请求的顺序以web.xml的顺序决定,响应的顺序则相返,先请求的后响应。

l 在开发中,有可能只对某个或某几个目录过滤,此时可以明确的写出是哪个目录过滤,增加过滤的映射路径即可。

执行Servlet时执行过滤器

<!-- Filter 配置 -->

<filter>

    <filter-name>filter1</filter-name>

    <filter-class>com.filter.SerlvetFilterA</filter-class>

</filter>

<filter-mapping>

    <filter-name>filter1</filter-name>

    <url-pattern>/user/*</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>filter1</filter-name>

<!--当访问Servletaabb时,执行过滤器filter1-->

    <servlet-name>aabb</servlet-name>

</filter-mapping>

<!-- Servlet 配置 -->

<servlet>

<servlet-name>aabb</servlet-name>

<servlet-class>com.servlet.Servlet1</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>aabb</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>






猜你喜欢

转载自blog.csdn.net/qq_40369944/article/details/79691133