龙空技术网

SpringMvc 过滤器Filter详解

Hi老杨 603

前言:

此刻大家对“java过滤器过滤特殊字符是什么”大体比较关怀,朋友们都想要了解一些“java过滤器过滤特殊字符是什么”的相关文章。那么小编也在网络上网罗了一些对于“java过滤器过滤特殊字符是什么””的相关内容,希望姐妹们能喜欢,同学们一起来了解一下吧!

一、简介

过滤器依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

二、Filter执行机制

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter类,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

Filter接口中有方法void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)用来执行filter的工作。每一个filter从doFilter()方法中得到当前的request及response对象。在这个方法里,可以进行任何的针对request及response的操作,包括收集数据,包装数据等。filter调用chain.doFilter()方法将请求从该filter中放行。之后,有可能请求到了要访问的资源对象,也有可能把控制权交给了下一个filter。

当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。是否调用目标资源(即是否让用户访问web资源)。调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

三、Filter入门demo

首先,新建一个Filter类,实现javax.servlet.Filter接口。

@Component@WebFilter(filterName = "testFilter",urlPatterns = {"/test/*","/test/**"})public class TestFilter implements Filter{    @Override    public void init(FilterConfig filterConfig) throws ServletException    {        System.out.println("----------------------->过滤器被创建");    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws            IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) servletRequest;        String requestURI = req.getRequestURI();        System.out.println("--------------------->过滤器:请求地址"+requestURI);        filterChain.doFilter(servletRequest, servletResponse);    }    @Override    public void destroy() {        System.out.println("----------------------->过滤器被销毁");    }

在这个filter的实现类中,在请求时输出提示信息和请求的url到控制台。

注意配置信息@WebFilter(filterName = "testFilter",urlPatterns = {"/test/*","/test/**"})

从这个配置信息,可以看出,filter的配置分为两部分:一部分是定义filter的名称和filter实现类的关联关系,另外一部分是定义filter所拦截请求的过滤规则。这里我们配置了两个请求url的拦截规则,也就是拦截所有对jsp和html页面的请求(前面已经说明filter可以拦截对静态资源的请求)。前一部分我们称为注册Filter,后一部分我们称为映射Filter。

这里需要注意urlpattern的配置规则:

以/开头和以/*结尾的是用来做路径映射的。以前缀*.开头的是用来做扩展映射的。/是用来定义default servlet映射的。剩下的都是用来定义详细映射的。比如: /aa/bb/cc.jsp四、Filter其它说明4.1 Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

4.2 Filter生命周期4.2.1 创建

Filter的创建和销毁由应用服务器负责。 web应用启动时,应用服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

4.2.2 销毁

Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

4.2.3 FilterConfig接口

用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

String getFilterName():得到filter的名称。String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。public ServletContext getServletContext():返回Servlet上下文对象的引用。

@WebFilter(filterName="Filter",urlPatterns="/*", initParams = {        @WebInitParam(name = "noLoginPaths", value = "index"),        @WebInitParam(name = "charSet", value = "utf-8")        })
4.3 映射Filter时的dispatcher属性

<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。如下:

@WebFilter(filterName = "testFilter",urlPatterns = {"/test/*","/test/**"},dispatcherTypes = { DispatcherType.ASYNC,DispatcherType.REQUEST})

<dispatcher>子元素可以设置的值及其意义:

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

标签: #java过滤器过滤特殊字符是什么 #jsp过滤html