过滤器

来源:互联网 发布:js右键弹出菜单 编辑:程序博客网 时间:2024/04/27 18:42
在JSP中,过滤器是一项非常重要的技术。比如在一个网站中,某些页面需要用户登陆后才可进入,如果没有过滤器那么就需要在这些页面中加入验证用户是否已登陆的代码。虽然这也算个解决的方案,但是这种方法并不是最好的。如果使用过滤器那么就可以将这些验证的代码写入到过滤器中,以后这些页面的请求都会先经过该过滤器,如果验证成功才会将请求传送至Web服务器。过滤器的用处还不只于此,解决中文乱码的问题就是过滤器最常用的功能之一。下面就以制作一个简单的编码转换的过滤器为例,一步一步的来学习过滤器。
首先需要明白过滤器的基本原理,过滤器是在客户端请求和Web服务器之间的一种过滤技术。也就是说当用户在浏览器的地址栏中输入地址后,此时就向Web服务器发送了一个请求,如果加入了过滤器后,客户端的请求会先发送至过滤器,然后再由过滤器发送至服务器进行处理,最后由服务器将处理的结果返回给客户端,并显示在浏览器上。有了过滤器之后,我们可以将转换乱码的代码加在过滤器中,这样当客户端向服务器端发起请求后,都会先经过过滤器,将编码进行转换再发送至服务器,从而使乱码问题得到解决。
接下来就是如何创建一个过滤器,这和Servlet的创建有相似之处,首先还是要在web.xml中进行相应的配置。假设我们在项目中的com.lovo.filter这个包下建立一个TestFilter类,那么下面就是web.xml的设置:
<?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>TesstFilter</filter-name>
    <filter-class>com.lovo.filter.TestFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>TesstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
.  .  .
</web-app>

接下来就是需要在com.lovo.filter包下建立TestFliter类:
package com.lovo.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;

public class TestFilter implements Filter{
    String encoding;
    FilterConfig filterConfig;
    public void destroy() {
        encoding = null;
        filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(encoding !=null)
        {
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
           
        }
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        encoding = filterConfig.getInitParameter("encoding");
    }
}
建立过滤器需要实现javax.servlet.Filter接口,并实现其中init、doFilter、destroy三个方法。
init主要是负责初始化过滤器,也就是服务器启动时会初始化一次,并在Web服务器的生命周期之内只会调用这一次。
doFilter负责过滤客户端的请求,客户端每一次请求都会调用该方法。
destroy是在Web服务器关闭时调用。

在项目中加入该过滤器后就能解决80%的乱码问题。但是这里要说明的是并不是所有的乱码问题都可以通过这个过滤器来解决,比如说使用get传输方式,或者在URL地址中将中文作为参数传递到一个页面,那么过滤器就无能为力了。有三种方式可以暂时的解决这个问题。
第一、尽量不要使用get传输方式或者通过URL地址传递中文字符。使用POST就没这个问题。
第二、如果使用TOMCAT服务器,可以在tomcat/conf/server.xml里面修改<Connector>加上URIEncoding="UTF-8" 。
第三、使用String(byte[] bytes, String charsetName) 来将字符串进行解码。比如
String str = new String(request.getParameter("key").getBytes("ISO-8859-1"), "UTF-8"))
 
原创粉丝点击