WEB应用程序中的过滤器Filter

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中的令牌值,然后执行数据处理;如果不相等,则提示用户己经提交过了表单,同时产生一个新的令牌值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值