java过滤器——filter的使用和配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46276529

       在做DRP的过程中用到了filter。前几天昌哥和欢姐在小会议室向我们介绍了AOP的思想,用到filter时觉得它们两者特别相似。

       如下图:

       javaweb开发中,request和response是两个必不可少的对象,他们是在接收到每一次客户端请求后,由web服务器产生的。filter可以在request到达servlet之前和response即离开servlet时分别对它们进行处理。        filter常常用于网站过滤敏感词汇、设置字符集、日志等比较“公共性”的事件处理中。

在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着“切了一刀”。通过配置,它可以对任意代码路径进行过滤。

       这里以转码/设置字符集为例,简单了解一下如何使用filter。

       建立Filter

       CharsetEncodingFilter.java

package com.drp.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统一处理filter
 * @author Danny
 *
 */
public class CharsetEncodingFilter implements Filter {

	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("CharsetEncodingFilter---->>>>Filter开始");
		request.setCharacterEncoding("utf-8");    //设置字符集
		chain.doFilter(request, response);    //继续执行
                System.out.println("CharsetEncodingFilter---->>>>Filter结束");
	}

	@Override
	public void init(FilterConfig config) throws ServletException {}

}

      此过滤器CharsetEncodingFilter实现了javax.servlet.Filter接口(任何filter过滤器也必须实现这个接口);在服务器创建此filter并进行初始化执行init方法时,读取配置文件并存入FilterConfigure的对象中;实现doFilter方法,在请求到达jsp之前将字符集编码设置为utf-8,chain.doFiler()方法的作用是在对request对象进行处理之后,跳转到被拦截的servlet继续执行,执行完之后还要回到此处,chain.doFilter()下面还可以对response对象进行处理。

       配置filter

       web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <filter>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<filter-class>com.drp.filter.CharsetEncodingFilter</filter-class>
  </filter>
  <filter-mapping><!-- 此filter对所有的jsp页面都有过滤效果 -->
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>
</web-app>

       此处配置所起的作用是,此filter对所有的jsp页面都有设置字符集的效果,当每次访问jsp页面时,都会执行filter中的doFilter()方法,因此每次访问jsp页面前后,都可以在Console中看到doFilter方法输出的 “ CharsetEncodingFilter---->>>>Begin ” 和 “CharsetEncodingFilter---->>>>End ”。

       除此之外还有其他几种对filter作用域配置的方式:

       对所有的对象都有过滤效果

<filter-mapping>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
</filter-mapping>

        对sysmgr下的所有对象都有过滤效果,无论是servlet还是jsp

<filter-mapping>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<url-pattern>/sysmgr/*</url-pattern>
</filter-mapping>

         只对指定的servlet具有过滤效果

<filter-mapping>
  	<filter-name>CharsetEncodingFilter</filter-name>
  	<url-pattern>/servlet/LoginServlet</url-pattern>
</filter-mapping>

      至此,无论访问哪个jsp页面,都会事先设置其字符集,不用分别对每个页面都进行设置了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何使用Java调用HBase的 Endpoint Coprocessor

3502
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十五天 Ajax学习【悟空教程】

在实际开发中,完成注册功能前,如果用户填写用户信息,准备填写其他信息时,将提示当前用户的用户名是否可用。效果图如下:

1343
来自专栏Java帮帮-微信公众号-技术文章全总结

过滤器Filter精华知识点,怎能不看 ​

过滤器Filter ? 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。 当用户请求...

3847
来自专栏码匠的流水账

聊聊selenium的webdriver的超时参数

selenium-api-2.53.1-sources.jar!/org/openqa/selenium/WebDriver.java

852
来自专栏Android 研究

OkHttp源码解析(十) OKHTTP中连接与请求及总结

主要看下ConnectInterceptor()方法,里面代码已经很简单了,受限了通过streamAllocation的newStream方法获取一个流(Htt...

1804
来自专栏逆向技术

x64内核HOOK技术之拦截进程.拦截线程.拦截模块

            x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么...

5057
来自专栏Android研究院

彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想

在OKhttp 源码解析之前,我们必须先要了解http的相关基础知识,任何的网络请求都离不开http。

5922
来自专栏吉浦迅科技

当CUDA程序执行后没有反应.....

有一天,QQ群里有人求助,说CUDA程序执行后没有反应!! ? 不过这个问题太常见了,经常被问及到 ? 面对这个情况,让我们来说说 CUDA调试正确的打开方式!...

4437
来自专栏JetpropelledSnake

SNMP学习笔记之SNMP4J介绍(Java)

  SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++...

2965
来自专栏从零开始学自动化测试

Appium+python自动化29-toast消息

前言 appium1.5以后的版本才支持toast定位,并且 'automationName'得设置为'Uiautomator2',才能捕获到。 一、 Supp...

5026

扫码关注云+社区

领取腾讯云代金券