servlet 高级知识之Filter
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的更多相关文章
- servlet 高级知识之Listener
Listener,顾名思义,监听器.它可以监听客户端的请求.服务端的操作等. 通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionCre ...
- Servlet高级部分Filter(过滤器)
一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改.它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterCha ...
- Servlet基础知识
基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- Servlet的学习之Filter过滤器技术(1)
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- 自理一遍android 高级知识
之后按目录得复习巩固 目录: 客卓高级知识整理 1 移动架构 1.1 素养与基础 1.1.1 主流设计模式 创建型 行为型 结构型 1.1.2 UML 1.1.3 设计原则 1.1.4 AOP架构 1 ...
- DataBase MongoDB高级知识-易使用
MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...
- DataBase MongoDB高级知识-易扩展
MongoDB高级知识-易扩展 应用程序数据集的大小正在以不可思议的速度增长.随着可用宽带的增长和存储器价格的下跌,即使是一个小规模的应用程序,需要存储的数据也可能大的惊人,甚至超出了很多数据库的处理 ...
- DataBase MongoDB高级知识
MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...
随机推荐
- python print 美化
本来是按照百度搜到的教程来为print输出添加颜色 然后bing了下,已经有封装好的包了,就是python-blessings 效果如图 API网址:https://blessings.readthe ...
- 使用iptables禁止外网访问tomcat的8080端口
如果项目同时使用了nginx反向代理服务器和tomcat等web服务器,并且两台服务器都暴露于公网中,那么通常我们会禁止外网直接访问tomcat,因为以下原因: 1.如果可以直接访问tomcat,那么 ...
- easyui中自定义下拉框的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 比较perl+python
作者:iTech出处:http://itech.cnblogs.com/ http://hyperpolyglot.org/scripting perl (1987) python (1991) ...
- poj1845(逆元+快速幂)
题目链接:https://vjudge.net/problem/POJ-1845 题意:求A的B次方的所有因子(包括1)的和对9901的模. 思路:首先对A利用唯一分解定理得A=p1x1*p2x2*. ...
- poj1984(带权并查集)
题目链接:http://poj.org/problem?id=1984 题意:给定n个farm,m条边连接farm,k组询问,询问根据前t3条边求t1到t2的曼哈顿距离,若不可求则输出-1. 思路:类 ...
- CentOS Find命令
find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录和文件全部进 ...
- RocketMq顺序消费
部分内容出处 https://www.jianshu.com/p/453c6e7ff81c rocketmq内部有4个默认的队里,在发送消息时,同一组的消息需要按照顺序,发送到相应的mq中,同一组 ...
- 100-days: Two
Title: London HIV patient's remission spurs hope for curing AIDS HIV 艾滋病毒 human immunodeficiency vi ...
- f5电源模块损坏
现象: ssh登录f5后有日志显示 现场确认f5 2槽电源指示灯不亮,且电源线正常.重新开关电源模块,拔插电源线后仍不亮.故确认是电源模块损坏. 处理:直接采购新的电源模块更换即可.f5电源支持热插拔 ...