package com.ry.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
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 RyEncodingFilter implements Filter {
private FilterConfig config = null;
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//--全站响应乱码解决
response.setContentType("text/html;charset="+encode);
//--全站请求乱码解决
chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);
}
/**
* request中有请求乱码,没法直接解决
* 所以我们的思路是,通过装饰,改造request对象上和获取请求参数相关的三个方法,使这三个方法拿到有乱码的之后,解决乱码再返回
* @author park
*
*/
class MyHttpServletRequest extends HttpServletRequestWrapper{
HttpServletRequest request = null;
boolean hasNotEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map<String,String[]> getParameterMap() {
try {
if(request.getMethod().equals("POST")){//--对于POST请求,一行代码解决乱码,返回Map
request.setCharacterEncoding(encode);
return request.getParameterMap();
}else if(request.getMethod().equals("GET")){//--对于GET请求
//--拿到map,有乱码!
Map<String,String[]> map = request.getParameterMap();
//--遍历map,处理所有的乱码
if(hasNotEncode){//--由于request会缓存第一次获取过的map,所以乱码解决只在第一次做即可,利用这个标记,使乱码解决代码只在第一次执行
for(Map.Entry<String, String[]>entry : map.entrySet()){
String [] vs = entry.getValue();
for(int i = 0;i<vs.length;i++){
vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);
}
}
hasNotEncode = false;
}
//--返回处理过乱码的map
return map;
}else{//--其他请求方式,不做处理,直接返回
return request.getParameterMap();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public String[] getParameterValues(String name) {
return getParameterMap().get(name);
}
@Override
public String getParameter(String name) {
String [] vs = getParameterValues(name);
return vs == null ? null : vs[0];
}
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.encode = filterConfig.getInitParameter("encoding");
}
}
==========附件中有详细的标注讲解==========
(ps:希望爱好编程的小伙伴能加这个群,互相帮助,共同学习。群号: 141877583 )
- 大小: 1 MB
分享到:
相关推荐
这个“VTK入门及应用案例”压缩包文件很可能是为了帮助初学者理解和掌握VTK的基本用法和常见应用场景。下面我们将深入探讨VTK的基础知识、核心功能以及可能包含的样例程序。 **VTK基础** 1. **架构**: VTK采用模块...
这个“rabbitMQ代码案例 简单入门”的资料包为初学者提供了了解和学习RabbitMQ的基础知识。 首先,让我们了解一下RabbitMQ的基本概念: 1. **消息队列**:RabbitMQ的核心是消息队列,它负责存储和转发消息。生产者...
现在,我们来分析这个入门案例。案例通常包含以下几个步骤: 1. **环境搭建**:确保你已经安装了Java JDK、Apache Tomcat服务器和Maven(如果使用)。然后,创建一个新的Maven项目,并添加Struts2的依赖。 2. **...
7. **过滤器**:过滤器用于格式化或转换数据,如日期格式化、货币格式化等。在表达式中使用管道符号(|)即可应用过滤器。 在"AngularDemo"这个压缩包中,可能包含了以下内容: - HTML文件:展示了如何在页面中...
- **Measurement Setup**:定义测量参数,如数据源、过滤器及分析窗口。 - **数据源**: - **实时数据(Online)**:来自仿真节点或外部硬件(如VN1630A、VN1640A)。 - **离线数据(Offline)**:从文件读取记录...
在VTK中,数据通过一系列过滤器进行处理,这些过滤器执行特定的任务,如数据转换、几何操作或数据分析。 在STEP2中,我们可能会接触到一个简单的VTK程序示例,通常包含以下步骤: 1. **导入VTK库**:在编程环境中...
而"Wireshark数据包分析实战.pdf"则很可能是一份详细的教程,涵盖从安装Wireshark到实际操作的各个步骤,以及具体案例分析。 在学习Wireshark时,你需要掌握如何启动和停止捕获,如何使用过滤器,如何解析不同协议...
11. **布隆过滤器**:用于可能存在的元素检测,避免插入重复数据,节省存储空间,但可能会有误判。 12. **Sorted Set的zrange/zrevrange命令**:根据分数对有序集合进行范围查询,是数据分析和排序的重要工具。 ...
5. 过滤器表达式:了解如何利用过滤器控制数据的显示和处理。 6. 实例分析:通过实际案例,演示如何解决常见的数据分析问题。 在深入学习DAX的过程中,建议结合Power BI的实际操作进行练习,以便更好地理解和掌握。...
8. **Intent过滤器**:通过Intent过滤器,你可以指定一个Activity或Service可以响应哪些Intent,使得其他应用可以启动你的组件。 9. **资源管理**:Android支持本地化和多分辨率资源,开发者需要学会如何为不同语言...
在“Wireshark从入门到精通.pdf”这份文档中,你将学习如何安装和配置Wireshark,包括选择合适的网卡、设置捕获过滤器以及启动和停止数据包捕获。此外,还会详细介绍Wireshark的用户界面,如显示过滤器的使用,以及...
3. **设置过滤器:** - 根据需求设置数据包过滤规则,以便专注于特定类型的数据包分析。 4. **监控与分析:** - 启动实时监控功能,观察网络性能指标。 - 使用OmniPeek提供的工具对捕获的数据包进行分析。 ####...
以上内容构成了Elastic Stack的入门与实践的详细知识点,涵盖安装、配置、操作、案例分析等多个方面。学习和掌握这些知识点,有助于更好地利用Elastic Stack进行日志和数据的搜索、分析和可视化工作。
- **Answers**:答案组件提供了报表和分析的交互式环境,用户可以自定义视图、过滤和排序数据。 - **Dashboard**:仪表板是OBIEE的重要部分,它将多个报表和分析集中在一个页面上,以便于决策者一目了然地查看关键...
#### 七、案例分析 以上代码展示了如何使用ASP.NET MVC创建一个简单的电影列表页面: 1. **页面头部**: - 使用`@model`指定模型类型。 - 设置视图标题`ViewBag.Title`。 - 创建链接到创建新记录页面的链接`@...
《Elastic Stack从入门到实践项目》是一份深入学习Elastic Stack的宝贵资源,它包含了丰富的实践案例和代码示例,旨在帮助初学者快速掌握这一强大的数据搜索、分析和可视化平台。Elastic Stack,通常由Elasticsearch...
06.样例类入门案例 07.样例类的默认方法 08.样例对象 09.案例_计算器 第十章 常用容器(数组, 元组, 集合等) 00.导学 01.创建定长数组 02.创建变长数组 03.变长数组的增删改操作 04.遍历数组 05.数组的常用...
WEKA提供了如Filter(过滤器)类工具进行预处理操作。 3. **模型构建**:在预处理后的数据上选择合适的机器学习算法,如决策树(J48)、支持向量机(SVM)、朴素贝叶斯等,通过"选择算法"进行模型训练。 4. **评估...