Servlet 过滤器

 

 

1.Servlet 过滤器是什么?

Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、

声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。

动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。

灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。

模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。

可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。

可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越

透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。
2.Servlet 过滤器体系结构

正如其名称所暗示的, Servlet 过滤器用于拦截传入的请求和/或传出的响应,并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件,可以将它们添加到请求/响应链中,或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理,因而不应该将它们直接嵌入 Web 应用程序框架,除非是通过 Servlet API 中良好定义的标准接口来实现。

Web

当过滤器在 Servlet 2.3 规范中首次引入时,它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源,那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此,Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性!

3.编写实现类的程序
过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在

为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:

init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。

doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法―― doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain 对象。

destroy() :正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。
SessionFilter.java
package net.pms.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
* @author jfish
* @since 2006.1.12
*/
public class SessionFilter implements Filter {

     public static boolean isContains(String container, String[] regx) {
           boolean result = false;

           for (int i = 0; i < regx.length; i++) {
                 if (container.indexOf(regx ) != -1) {
                       return true;
                 }
           }
           return result;
     }

     public FilterConfig config;

     public void setFilterConfig(FilterConfig config) {
           this.config = config;
     }

     public FilterConfig getFilterConfig() {
           return config;
     }

     public void doFilter(ServletRequest request, ServletResponse response,
                 FilterChain chain) throws IOException, ServletException {

           HttpServletRequest httpreq = (HttpServletRequest) request;
           HttpServletResponse httpres = (HttpServletResponse) response;

           HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
                       (HttpServletResponse) response);
           String logonStrings = config.getInitParameter("logonStrings");
           String includeStrings = config.getInitParameter("includeStrings");
           String redirectPath = httpreq.getContextPath()
                       + config.getInitParameter("redirectPath");
           String disabletestfilter = config.getInitParameter("disabletestfilter");

           if (disabletestfilter.toUpperCase().equals("Y")) {
                 chain.doFilter(request, response);
                 return;
           }
           String[] logonList = logonStrings.split(";");
           String[] includeList = includeStrings.split(";");
           Object user = httpreq.getSession().getAttribute("userinfo");
           if (user == null) {
                 if (!this.isContains(httpreq.getRequestURI(), includeList)) {
                       chain.doFilter(request, response);
                       return;
                 }
                 if (this.isContains(httpreq.getRequestURI(), logonList)) {
                       chain.doFilter(request, response);
                       return;
                 }
                 wrapper.sendRedirect(redirectPath);

           } else {
                 chain.doFilter(request, response);
           }
     }

     public void destroy() {
           this.config = null;
     }

     public void init(FilterConfig filterConfig) throws ServletException {
           this.config = filterConfig;
     }
}
4.配置 Servlet 过滤器
在web.xml中:
        <filter>
           <filter-name>SessionFilter</filter-name>
           <filter-class>net.pms.web.filter.SessionFilter</filter-class>
           <init-param>
                 <param-name>logonStrings</param-name>
                 <param-value>login.jsp</param-value>
           </init-param>
           <init-param>
                 <param-name>includeStrings</param-name>
                 <param-value>.jsp;.html</param-value>
           </init-param>
           <init-param>
                 <param-name>redirectPath</param-name>
                 <param-value>/login.jsp</param-value>
           </init-param>
           <init-param>
                 <param-name>disabletestfilter</param-name>
                 <param-value>N</param-value>
           </init-param>
     </filter>
      <filter-mapping>
           <filter-name>SessionFilter</filter-name>
           <url-pattern>/*</url-pattern>
     </filter-mapping>
其中参数logonStrings,登陆页面
includeStrings,过滤页面参数
redirectPath,没有登陆转向页面
disabletestfilter,过滤器是否有效。
另附一字符集过滤类:
package net.pms.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
* @author jfish
* @since 2006.1.12
*
*/
public class SetCharacterEncodingFilter implements Filter {


     protected String encoding = null;

     protected FilterConfig filterConfig = null;

     protected boolean ignore = true;

     public void destroy() {

           this.encoding = null;
           this.filterConfig = null;

     }

     public void doFilter(
           ServletRequest request,
           ServletResponse response,
           FilterChain chain)
           throws IOException, ServletException {

           // Conditionally select and set the character encoding to be used
           if (ignore || (request.getCharacterEncoding() == null)) {
                 String encoding = selectEncoding(request);
                 if (encoding != null)
                       request.setCharacterEncoding(encoding);
           }

           // Pass control on to the next filter
           chain.doFilter(request, response);

     }

     public void init(FilterConfig filterConfig) throws ServletException {

           this.filterConfig = filterConfig;
           this.encoding = filterConfig.getInitParameter("encoding");
           String value = filterConfig.getInitParameter("ignore");
           if (value == null)
                 this.ignore = true;
           else if (value.equalsIgnoreCase("true"))
                 this.ignore = true;
           else if (value.equalsIgnoreCase("yes"))
                 this.ignore = true;
           else
                 this.ignore = false;

     }

     protected String selectEncoding(ServletRequest request) {

           return (this.encoding);

     }

}
在web.xml中配置如下:
<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>net.pms.web.filter.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>GBK</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
不过,在spring中带有此过滤器
在web.xml中配置如下:
    <filter>
           <filter-name>encodingFilter</filter-name>
           <filter-class>
                 org.springframework.web.filter.CharacterEncodingFilter
           </filter-class>
           <init-param>
                 <param-name>encoding</param-name>
                 <param-value>GBK</param-value>
           </init-param>
           <init-param>
                 <param-name>forceEncoding</param-name>
                 <param-value>true</param-value>
           </init-param>
     </filter>
      <filter-mapping>
           <filter-name>encodingFilter</filter-name>
           <url-pattern>*.html</url-pattern>
     </filter-mapping>
     <filter-mapping>
           <filter-name>encodingFilter</filter-name>
           <url-pattern>*.jsp</url-pattern>
     </filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值