Filter叫做拦截器, 对目标资源拦截,拦截HTTP请求和HTTP响应,本质是对url进行拦截。

与serlvet不同的是, Filter的初始化是随着服务器启动而启动。

在Filter接口中定义了三个方法
 init 初始化
 doFilter 执行过滤【核心方法】
 destroy 销毁

Filter的配置和servlet类似,

  <filter>
<filter-name>Filter2</filter-name>
<filter-class>cn.itcast.filter.Filter2</filter-class>
<!-- 为过滤器配置初始化参数 -->
<init-param>
<param-name>company</param-name>
<param-value>cc</param-value>
</init-param>
</filter> <!-- 配置过滤器拦截哪个web 资源 -->
<filter-mapping>
<filter-name>Filter1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/hello.jsp</url-pattern>
<url-pattern>/index.jsp</url-pattern>
<!-- 过滤HelloServlet 通过Servlet名字对Servlet进行过滤 也可以按照url 即servlet的访问路径 /* 拦截所有 -->
<!-- <url-pattern>/hello</url-pattern>-->
<servlet-name>HelloServlet</servlet-name>
<!-- 在转发时进行过滤 如果不配置 默认request-->
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

 案例 通过serllet对get提交的数据进行编码处理,当然实际开发中,建议使用post方式提交数据。

  当然关于get方式中文乱码,有两种方式解决

第一种 配置tomcat server.xml URIEncoding="utf-8"   【一般不建议这样做】

第二种 new String(xxx.getBytes("ISO-8859-1"),"utf-8");

 

package cn.demo.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class EncodingFilter implements Filter { @Override
public void destroy() {
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 解决post
request.setCharacterEncoding("utf-8"); // 解决get
EncodingRequest encodingRequest = new EncodingRequest(
(HttpServletRequest) request);
chain.doFilter(encodingRequest, response); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
} } class EncodingRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private boolean hasEncode = false; public EncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
} @Override
public String getParameter(String name) {
// 通过getParameterMap方法完成
String[] values = getParameterValues(name);
if (values == null) {
return null;
}
return values[0];
} @Override
public String[] getParameterValues(String name) {
// 通过getParameterMap方法完成
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
} @Override
public Map getParameterMap() {
Map<String, String[]> parameterMap = request.getParameterMap();
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
return parameterMap;
} // get提交方式 手动转码 , 这里的转码只进行一次 所以通过 hasEncode 布尔类型变量控制
if (!hasEncode) {
Set<String> keys = parameterMap.keySet();
for (String key : keys) {
String[] values = parameterMap.get(key);
if (values == null) {
continue;
}
for (int i = 0; i < values.length; i++) {
String value = values[i];
// 解决get
try {
value = new String(value.getBytes("ISO-8859-1"),
"utf-8");
// values是一个地址
values[i] = value;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 一次转码完成后,设置转码状态为true
hasEncode = true;
}
}
return parameterMap;
}
}

  

servlet 高级知识之Filter的更多相关文章

  1. servlet 高级知识之Listener

    Listener,顾名思义,监听器.它可以监听客户端的请求.服务端的操作等. 通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionCre ...

  2. Servlet高级部分Filter(过滤器)

    一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改.它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterCha ...

  3. Servlet基础知识

    基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...

  4. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  5. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  6. 自理一遍android 高级知识

    之后按目录得复习巩固 目录: 客卓高级知识整理 1 移动架构 1.1 素养与基础 1.1.1 主流设计模式 创建型 行为型 结构型 1.1.2 UML 1.1.3 设计原则 1.1.4 AOP架构 1 ...

  7. DataBase MongoDB高级知识-易使用

    MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...

  8. DataBase MongoDB高级知识-易扩展

    MongoDB高级知识-易扩展 应用程序数据集的大小正在以不可思议的速度增长.随着可用宽带的增长和存储器价格的下跌,即使是一个小规模的应用程序,需要存储的数据也可能大的惊人,甚至超出了很多数据库的处理 ...

  9. DataBase MongoDB高级知识

    MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...

随机推荐

  1. java和c#中String

    java中: c#中: 1.拼接字符串 sql语句中 in() str="'001','002','003'";至于产生string就这样  str1="'001'&qu ...

  2. SQLMAP自动注入(一):sqlmap的简单使用和配合burpsuite使用

    python编写,开源 检测方式 基于布尔的盲注检测 基于时间的盲注检测 基于错误的检测 基于union的检测 基于堆叠的检测 优点 数据库直连 -d cookie过期后自动更新cookie信息 可以 ...

  3. putty颜色调整

    右键window窗口--Changing Setting--window--Colours: * Default Foreground: 255/255/255 * Default Backgroun ...

  4. jquery使用post方法传值

    1.js代码 <script type="text/javascript"> function addSku(skuId){ var m = $("#m&qu ...

  5. WPF HyperLink链接下划线隐藏

    两种方法: 1.在Grid标签内添加资源样式. <Grid.Resources> <Style TargetType="Hyperlink"> <Se ...

  6. nagios维护之常见问题

    一.重启nagios 报错: Starting nagios:This account is currently not available.     #这个账户目前不可用: 解决方法: a.编辑/e ...

  7. 7. Reverse Integer (整数的溢出)

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 For the p ...

  8. Mac安装MySQL数据库

    一 下载及安装社区版MySQL和MySQL Workbench. 二 如果MySQL Workbench无法登陆,则系统偏好设置-MySQL-Initialize Database,选择legacy开 ...

  9. 安装tensorflow ubuntu18.04

    1.首先安装环境是ubuntu18.04. $sudo apt-get install python-pip python-dev python-virtualenv2.安装virtualenv虚拟环 ...

  10. Kylin介绍,功能特点【转】

    Apache Kylin是一个开源的分布式分析引擎.完全由eBay Inc.中国团队开发 并贡献至开源社区.提供Hadoop之上的SQL查询接口及多维分析(MOLAP)能力以 支持大规模数据能在亚秒内 ...