文档章节

WEB应用程序中的过滤器Filter

hefeiuu
 hefeiuu
发布于 2017/05/04 20:27
字数 1691
阅读 19
收藏 0
点赞 0
评论 0
javax.servlet.Filter接口:开发过滤器要实现此接口,init()初始化方法,一般用于得到配置文件中的初始化参数;doFilter()过滤器方法,在特定的操作完成后,可以调用chain.doFilter()将请求传给下一个过滤器或目标资源,也可以直接向客户端返回响应信息,或者利用RequestDispatcher.forward()和include()方法,及HttpServletResponse.sendRedirect()方法将请求转向其它资源。destroy(),过滤器生命周期结束,用来释放资源。

过滤器在web.xml文件中的部署如下:
<!-- 编码过滤器 -->
<filter>
   <filter-name>encoding</filter-name>
   <filter-class>
    com.website.util.webutil.EncodingFilter
   </filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>encoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
Servlet容器对声明的每一个过滤器,只创建一个实例。容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务。
<filter-mapping>元素还可以包含0-4个<dispatcher>指定过滤器对应的请求方式,可以是REQUEST,INCLUDE,FORWARD,ERROR,默认是REQUEST。
过滤器代码如下:
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 annlee
*/
public class EncodingFilter implements Filter {

private String encoding;//目标编码类型,从web.xml配置文件中读取

public void destroy() {
}

/**
* 编码过滤
* @throws ServletException
* @throws IOException
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   request.setCharacterEncoding(encoding);
   chain.doFilter(request, response);
   response.setContentType("text/html;charset="+encoding);
}

public void init(FilterConfig config) {
   this.encoding = config.getInitParameter("encoding");
}

}
过滤器不能够直接改变请求和响应对象的状态,但是我们可以利用请求和响应的包装类来间接改变请求和响应的信息,在Servlet规范中,定义了4个包装类:ServletRequestWrapper,ServletResponseWrapper,HttpServletRequestWrapper,HttpServletResponseWrapper。
过滤器主要的应用场景包括:
1,对用户请求进行统一认证。2,对用户的访问请求进行记录和审核。3,对用户发送的数据进行过滤或替换。4,转换图像格式。5,对响应内容进行压缩,减少传输量。6,对请求和响应进行加解密处理。7,触发资源访问事件。8,对XML的输出应用XSLT。

常用字符集:
1,ASCII:American Standard Code for Information Interchange美国信息互换标准代码,是当今最通用的单字节编码系统。用一个字节来表示字符,最多能够表示256种字符。
2,ISO-8859-1:0-127的字符与ASCII相同,通常叫做Latin-1,包括了书写所有西文欧洲语言不可缺少的附加字符。
3,GB2312和GBK:GB2312是大陆标准汉字信息交换用编码。简称国标码。用两个字节来表示一个字符,分别称为高位和低位,为了与ASCII码区别,最高位都用1来表示,GBK是1995年新推出的规范,还不是国家标准,并不是所有的国际化软件都支持。
4,Unicode:统一的字符编码标准集,使用0-65535的双字节无符号数对每一个字符进行编码。在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode码,将会使数据量增加一倍,可以使用下面介绍的UTF-8编码。
5,UTF-8:English-bit UCS Transformation Format,对于常用的字符,即0-127的ASCII字符,UTF-8用一个字节来表示。
JAVA内部采用Unicode字符集来表示字符。当JAVA读取字符数据时,需要将本地字符集编码转换为Unicode编码,而在输出字符数据时,则需要将Unicode编码转换为本地字符集编码。

以POST方法提交的表单,可以在获取请求参数值之前,调用request.setCharacterEncoding("GBK"),在向浏览器发送中文数据之前,调用response.setContentType("text/html;charset=GBK"),指定输出内容的编码方式是GBK。
以GET方式提交的表单,只能在得到请求参数的值后作编码转换String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

对于JDBC驱动程序,JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式,要解决编码问题,要将数据库默认的编码格式改成自己想要的编码格式。

让Tomcat支持中文文件名或者中文URL要在<connector>元素中加上属性URIEncoding="UTF-8"就可以了。

Servlet规范中定义了四种验证机制:
1,HTTP Basic Authentication:用户名和密码采用BASE64编码,浏览器弹出对话框的形式,没有加密,不安全。
2,HTTP Digest Authentication:用户名和密码采用MD5算法加密,虽然比基本验证要更加安全,但目前并没有得到广泛的使用。
3,HTTPS Client Authentication:在SSL基础上的HTTPS验证,几乎所有的浏览器和Servlet容器都支持HTTPS协议,它是这四种中最安全的,不过实现的代价也是最高的。
4,Form Based Authentication:基于表单的验证类型于基本验证,而不是浏览器弹出对话框。用户名和密码也是明文的方式来传输的。

声明式安全:在web.xml文件中指定WEB应用程序的安全处理机制,这使得一个WEB应用程序无须修改任何代码就可以获得安全性。默认情况下,WEB应用程序的所有资源对每一个人都是可以访问的,通过在web.xml文件中配置<security-constraint>和<login-config>元素来限制对资源的访问。

防止SQL注入攻击:使用PrepareStatement,而不要使用Statement,不要使用String的+号来组装sql语句。
系统的出错信息不要直接提供给客户端,只应提供一些一般化的错误信息。用户输入数据的检查应充分,应该在客户端和服务器端都对用户输入的数据进行严格的检查,需要时,可以过滤输入数据中包含的特殊字符。对于sqlserver数据库,应该删除一些不必要的存储过程,如xp_cmdshell,xp_startmail,xp_sendmail,sp_makewebtask等。

利用同步令牌来解决重复提交的基本原理如下:
1,用户访问提交数据的页面,服务器端在这次会话中,创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到客户端,同时将令牌值保存到Session中。
2,用户提交页面,服务器先判断令牌值是否相等,相等南昌清除Session中的令牌值,然后执行数据处理;如果不相等,则提示用户己经提交过了表单,同时产生一个新的令牌值。

本文转载自:http://ufopw.iteye.com/blog/728754

共有 人打赏支持
hefeiuu
粉丝 3
博文 64
码字总数 0
作品 0
合肥
Struts2初始化流程

在讲Struts2的初始化之前,应该为大家描述下Web应用中的过滤器Filter,这关系到我们对核心过滤器FilterDispatcher的正确理解。 Filter:一个filter是一个对象,为每个请求资源(一个servlet或...

陶邦仁 ⋅ 2012/08/29 ⋅ 1

Java Web基础知识之Filter:过滤一切你不想看到的事情

不要相信客户端, 所以做后端的人都应该铭记的事情。因为前端传过来的数据并不总是合法和有效的,所以后端是对访问资源的最后一道保护伞。之前我们在Spring中说到过AOP编程,AOP基础知识,它...

lmy86263 ⋅ 2016/04/26 ⋅ 0

第七章 过滤器基础 Filter

简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter)。WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行...

陈嘻嘻哈哈 ⋅ 2015/11/04 ⋅ 0

java web/servlet的过滤器

整个struts的入口就在FilterDispatcher这个过滤器上(struts用FilterDispatcher再进行请求分发等等功能),可见servlet过滤器的重要作用 什么叫过滤器呢?   过滤器就是可以对浏览器向jsp,s...

cjun1990 ⋅ 2015/10/23 ⋅ 0

Servlet过滤器工作过程

Servlet过滤器工作过程 需注意,Filter不是一个Servlet,它不能产生一个response,它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。 将多个过滤器组成...

秋风醉了 ⋅ 2014/10/01 ⋅ 0

Filter及FilterChain的使用详解

一、Filter的介绍及使用 什么是过滤器? 与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的...

核桃白果 ⋅ 2012/10/29 ⋅ 0

Servlet 3.0 介绍

下载 Servlet 3.0 规范 Java servlets 是一项被普遍接受的技术,用于构建基于 web 应用程序的动态内容;Servlet 3.0 规范早期草案版本的发行让该技术在特性和应用程序接口(Application Progra...

红薯 ⋅ 2010/05/27 ⋅ 4

Filter(过滤器)

Filter简介: 可以使用户改变一个Request和修改一个Response,Filter不是Servlet,他不能产生一个Response。但他能够在Request到达Servlet之前预处理Request,也可以在离开Request时处理Res...

晨曦之光 ⋅ 2012/05/16 ⋅ 2

Filter使用详解

1、Servlet Filter概述   凡是开发过J2EE的web application的人员都知道,经常需要处理以下几种情况:    访问特定资源(Web 页、JSP 页、servlet)时的身份认证    应用程序级的访问...

小草莓 ⋅ 2012/08/10 ⋅ 0

javaweb学习总结——Filter(过滤器)学习

一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文...

LittlerBeans ⋅ 2015/10/13 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫 ⋅ 24分钟前 ⋅ 0

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部