文档章节

WEB应用程序中的过滤器Filter

hefeiuu
 hefeiuu
发布于 2017/05/04 20:27
字数 1691
阅读 19
收藏 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
合肥
私信 提问
第七章 过滤器基础 Filter

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

陈嘻嘻哈哈
2015/11/04
0
0
Java Web基础知识之Filter:过滤一切你不想看到的事情

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

lmy86263
2016/04/26
0
0
Filter及FilterChain的使用详解

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

核桃白果
2012/10/29
0
0
java web/servlet的过滤器

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

cjun1990
2015/10/23
50
0
Servlet Filter(过滤器)

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

_Roger_
2016/01/27
50
0

没有更多内容

加载失败,请刷新页面

加载更多

LinkedList基本用法

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. LinkedList的构造函数如下 1. public LinkedList(): ——生成空的链表 2. public LinkedList(Collection col)...

whoisliang
15分钟前
1
0
Andrew Ng教你如何引领公司进入AI时代

摘要: 人工智能时代,企业转型遇到困难?看看Andrew Ng的建议吧! AI(人工智能)技术就像100年前的电力一样,正准备改变每个行业。从现在到2030年,它将创造约13万亿美元的GDP增长。虽然它...

阿里云官方博客
32分钟前
1
0
斗图咖(www.doutuka.com)上线纪念

网站名称:斗图咖 网站描述:是一款年轻人都在玩的斗图网站,来斗图咖一起斗图装逼交朋友吧。站长每天上传收集的最新最火斗图,供大家娱乐聊天发表情;后期也会开发表情自主设计,自己设计表...

focusone
53分钟前
4
0
Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
今天
8
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部