DRP学习之路--Filter实现设置字符集

什么是filter?

  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态 
html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

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

怎么用filter?

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

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

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

下面以tomcat服务器为例,实现一个filter,来对字符集进行设置,图示如下:

实现filter实例:

1.编写java类实现Filter接口,并实现其doFilter方法。

package com.bjpowernode.drp.util.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;

/**
 * 采用Filter统一处理字符集
 * @author Administrator
 *
 */
public class CharsetEncodingFilter implements Filter {

	private String endcoding; 

	public void destroy() {
	}

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

		//System.out.println("CharsetEncodingFilter--->>>begin");
		//设置字符集

		//可以直接设置
		//request.setCharacterEncoding("GBK");

		//可以使用FilterConfig 通过配置文件获取
		request.setCharacterEncoding(endcoding);

		//继续执行
		chain.doFilter(request, response);

		//System.out.println("CharsetEncodingFilter--->>>end");
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		//使用FilterConfig 通过配置文件获取
		this.endcoding = filterConfig.getInitParameter("encoding");
		System.out.println("CharsetEncodingFilter.init()-->> endcoding=" + endcoding);
	}
}

2.在 web.xml文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<!--配置过滤器-->
	<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>	

	<!--映射过滤器-->
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<!--“*.jsp”表示拦截所有的jsp请求 -->
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
</web-app>

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

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

Filter小结:

      Filter 对 Servlet 容器发送给 Servlet 程序的请求和Servlet 程序回送给 Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给
Servlet程序,以及对请求和相应信息是否进行修改的这样一个切入性服务。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 19:42:10

DRP学习之路--Filter实现设置字符集的相关文章

DRP学习之路--Filter生命周期

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

JAVA学习之 浅析Filter

上一篇博客了解了Servlet,这次就来了解一下Filter,简单来说Filter是Servlet规范的一种技术,并不是一个Servlet.它也称为一个过滤器,用来改变一个request和修改一个response,能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response. 一.生命周期 上一篇也写到的Servlet的生命周期,Filter与Servlet类似: 1.启动服务器时加载Filter的实例,并调用Init()方

Jquery学习之路(三) 实现弹出层插件

弹出层的应用还是比较多的,登陆,一些同页面的操作,别人的总归是别人的,自己的才是自己的,所以一直以来想写个弹出层插件.不多废话,直接开始吧! 不想看可以在这里直接下载源码xsPop.zip 1:遮罩层 要弹出层,先要用一个遮罩层挡在下面的页面,此遮罩层是全屏的,页面滚动也要有,所以设置 position: fixed;还要有透明效果,下面是我定义的遮罩层css,取名mask .mask { position: fixed; width: 100%; height: 100%; backgroun

Android学习之路——Android四大组件之activity(一)

一.什么是Activity? Activity简单的说就是一个界面,我们在Android手机上看到的每一个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity,然后在清单文件manifest.xml文件的application节点下注册activity,这个activity就创建成功了. public class MyActivity extends Activity { } 2.清单文件注册activity <application android:a

LTE学习之路(4)——概述(续)

[EPS承载] 基础知识——TFT 数据包过滤器:通常是在数据包传送过程中允许或阻止它们的通过.如果要完成数据包过滤,就要设置好规则来指定哪些类型的数据包被允许通过和哪些类型的数据包将会被阻止. TFT(Traffic Flow Template):是关联到EPS承载上的一个数据包过滤器的集合,分为上行过滤模版UL TFT(UpLink TFT)和下行过滤模版DL TFT(DownLink TFT). UL TFT是一组上行数据包过滤器,DL TFT是一组下行数据包过滤器.每一个专用承载都关联一

Jquery 学习之路(四)高大上的图片轮换

网站首页没有一点动画怎么可以,我以前用过Flash As3做过图片切换,效果非常不错,可是麻烦,改变起来麻烦.一直都想自己做个图片切换效果,总认为比较麻烦,今天自己实践了一下,其实还比较简单.不过有个小问题,IE8不兼容模式下 设置有透明效果的div 样式添加失效了,但是我用谷歌,IE8兼容测试都ok. 反正是给自己记录的,也不多话了,js没有与页面分离,也没有做出插件.一个网站要不了几个这种效果,先实现了再说吧.最后的效果还是很高大上的. 下载地址:http://files.cnblogs.c

Python学习之路—2018/6/29

Python学习之路-2018/6/29 1.跨表查询 跨表查询: 基于对象查询 基于双下划线查询 聚合和分组查询 F与Q查询 F查询 过滤器只能讲字段值与常量进行比较,如果需要用到与字段值进行比较则需要用到F查询,F查询还支持与常量之间的加减乘除的运算.数据: # 查询评论数大于阅读数的书籍 >>> Book.objects.filter(comment_count__gt=F("read_count")) <QuerySet [<Book: 斗破苍穹&

Azure云平台学习之路(三)——Cloud Services

1.什么是云服务? 能够部署高度可用的且可无限缩放的应用程序和API.简而言之,就是你写的CMD程序按照一定的框架进行少量修改就能运行在Azure云平台上. 2.Azure云服务有什么特点? (1)专注应用程序而不是硬件,PaaS的一种. (2)支持多种框架和语言. (3)集成了运行状况监视和负载平衡. (4)自动缩放优化成本和性能 3.建立云服务之前,我们需要建立一个云存储,来记录我们的程序的日志信息(当然,这不是必须的) (1)选择左边导航栏的"存储".主面板上显示的是所有已有的存

linux学习之路及文本查看和文本处理命令

这一篇主要介绍几个常用的文本查看命令和文本处理命令. 首先介绍文本查看命令 cat:用于连接文件并显示 说明:当只有一个文件时,则用于查看文件内容:当有多个文件时,cat命令会将这些文件连接起来,在一起显示出来 语法格式:cat [option] FILE... -n:显示内容的时候把行号显示出来 -E:显示每一行的结束符$符(默认不显示) tac:也是用于显示文件内容,只不过他是将文件的内容倒过来显示,与cat相反 -n:显示行号 -E:显示每一行结尾的结束符$ 分屏操作命令 more与les