java字符集过滤器_JAVA中的使用Filter过滤器设置字符集

本文介绍了Java中Filter的概念,它可拦截Request和Response请求,对其进行预处理和后处理,只对post请求有效。阐述了Filter的生命周期,还给出了使用Filter设置字符集防止jsp中文乱码的实例,最后指出Filter能提高代码灵活性,还可用于验证权限、网站压缩等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter是什么?

Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response。它虽然不能产生一个response,但可以在一个request到大Servlet之前预处理request,也可以在response离开Servlet时处理response。

具体的调用关系如下图所示。

cbb6bc526abe5dff14a6905d9646d2c6.png

也可以说,Filter是对Request和Response请求进行了拦截。

注意:

只对post请求有效。

新建一个TestFilter类,继承Filter类后,我们可以看到主要的几个方法。

package com.bjpowermode.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;

public class TestFilter implements Filter {

@Override

public void destroy() {

// TODO Auto-generated method stub

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

// TODO Auto-generated method stub

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

// TODO Auto-generated method stub

}

}

1)init()

用来设置filter的配置对象,只调用一次。

2)doFilter()

是最重要最核心的方法,执行Filter的工作。每一个filter从doFilter()方法中得到当前的request及response

3)destory()

返回配置对象。

Filter的生命周期

在应用启动的时候就进行装载Filter类。容器创建好Filter对象实例后,调用init()方法。接着保存进集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

注意:init方法与destroy方法只会直接一次。

在实例中,我们用Filter主要是来设置字符集,防止jsp出现中文乱码现象。

如果不使用Filter,我们需要在每个jsp页面中添加如下语句:

pageEncoding="GB18030"%>

那么,使用Filter之后呢?

package com.bjpowermode.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统一处理字符集

*/

public class CharSetEncodingFilter implements Filter {

private String encoding;

@Override

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain chain) throws IOException, ServletException {

//System.out.println("CharsetEncoding--->>>begin");

//设置字符集

arg0.setCharacterEncoding("GB18030");

//继续执行

//如果还有filter,继续调,如果没有,就调jsp

chain.doFilter(arg0,arg1);

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

}

@Override

public void init(FilterConfig arg0) throws ServletException {

//System.out.println("CharsetEncoding--->>>init");

this.encoding=arg0.getInitParameter("encoding");

//System.out.println("CharsetEncoding--->>>init"+encoding);

}

}

在配置文件中进行配置。

注意:

CharSetEncodingFilter方法名和与配置文件中要一致,

类的路径com.bjpowermode.drp.util.filter.CharSetEncodingFilter。

CharSetEncodingFilter

com.bjpowermode.drp.util.filter.CharSetEncodingFilter

encoding

GBK

CharSetEncodingFilter

*.jsp

总结:

Filter提高了代码的灵活性,将变动移到了配置文件中而不是在页面上。

Filter除了可以设置字符集,解决乱码问题外,还可以用在验证用户权限,对网站进行压缩等方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值