### Java中配置过滤器 在Java Web开发中,过滤器(Filter)是一种非常重要的机制,它可以在请求到达目标资源之前或响应返回客户端之后执行特定的操作。例如,可以使用过滤器来实现统一的编码设置、安全控制、日志记录等功能。 #### 一、过滤器的基本概念 过滤器是通过实现`javax.servlet.Filter`接口来创建的,该接口定义了三个方法: 1. **`init(FilterConfig config)`**:初始化方法,在服务器启动时调用。 2. **`doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`**:核心处理方法,用于处理请求和响应。 3. **`destroy()`**:销毁方法,在服务器关闭时调用。 #### 二、web.xml中的配置 在传统的Java Web应用中,过滤器的配置通常是在`web.xml`文件中完成的。下面是一个示例配置: ```xml <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>net.vschool.web.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这段配置表示: - **`filter`**标签定义了一个名为`CharacterEncodingFilter`的过滤器。 - **`filter-class`**属性指定了过滤器类的全限定名。 - **`init-param`**标签用于传递初始化参数,这里的参数`encoding`指定为`GBK`。 - **`filter-mapping`**标签指定了这个过滤器的作用范围,通过`url-pattern`属性设置为`/*`,表示所有URL都适用此过滤器。 #### 三、CharacterEncodingFilter.java 接下来,我们来看一下具体的过滤器实现代码: ```java public class CharacterEncodingFilter implements Filter { protected String encoding = null; @Override public void init(FilterConfig filterConfig) throws ServletException { this.encoding = filterConfig.getInitParameter("encoding"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(encoding); ((HttpServletResponse) response).setContentType("text/html;charset=" + encoding); chain.doFilter(request, response); } @Override public void destroy() { // 清理资源 } } ``` 1. **初始化方法**:`init`方法读取`web.xml`文件中的初始化参数,并将其保存到类的成员变量`encoding`中。 2. **核心处理方法**: - 调用`request.setCharacterEncoding(encoding)`设置请求的字符集编码。 - 调用`response.setContentType("text/html;charset=" + encoding)`设置响应的内容类型及字符集编码。 - 调用`chain.doFilter(request, response)`继续请求的后续流程。 3. **销毁方法**:一般用于释放过滤器占用的资源,如关闭连接等。在这个示例中没有具体实现。 #### 四、过滤器的作用 1. **统一字符编码设置**:确保在整个Web应用程序中使用一致的字符编码,避免乱码问题。 2. **安全性增强**:可以添加过滤器来检查请求数据的有效性,防止SQL注入等攻击。 3. **性能优化**:通过缓存机制减少对后端服务的访问次数。 4. **日志记录**:记录请求和响应的信息,便于后期分析和调试。 总结来说,过滤器在Java Web开发中扮演着非常重要的角色,合理地使用过滤器不仅可以提升系统的健壮性和可维护性,还可以显著提高开发效率。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>net.vschool.web.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CharacterEncodingFilter.java:
public class CharacterEncodingFilter implements Filter
{
protected String encoding = null;
public void init(FilterConfig filterConfig) throws ServletException
{
this.encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
- xb123692012-12-19谢谢,掉了一句response.setContentType("text/html;charset="+targetEncoding);然后就一直乱码! 楼主的这一句解决了我上午的困惑!菜鸟学习了!
- 粉丝: 2
- 资源: 37
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助