`
renyuan_1991
  • 浏览: 69436 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

过滤器入门案例分析

阅读更多
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
分享到:
评论

相关推荐

    最新PRO.ENGINEER中文野火版4.0技术入门与案例应用.pdf

    设置拾取过滤器 设置优先选项 停用目的管理器 3.2 工程讲堂 3.2.1 基本几何图元绘制 绘制线 绘制矩形 绘制圆 绘制圆弧 绘制圆角 绘制样条曲线 点和坐标系 创建文本 调色板 3.2.2 图元的编辑 图元的选取 图元的复制 ...

    【JavaScript源代码】Vue全家桶入门基础教程.docx

    Vue全家桶入门基础教程  目录 1. Vue概述 2. Vue的基本使用2.1 传统开发模式对比... Vue常用特性 5.1 常用特性概览 5.2 表单操作5.3 自定义指令5.4 计算属性5.5 侦听器5.6 过滤器5.7 Vue生命周期6.综合案例:图书管

    scala从入门到精通技术教学视频

    06.样例类入门案例 07.样例类的默认方法 08.样例对象 09.案例_计算器 第十章 常用容器(数组, 元组, 集合等) 00.导学 01.创建定长数组 02.创建变长数组 03.变长数组的增删改操作 04.遍历数组 05.数组的常用...

    silverlight 3 控件经典入门学习案例

    案例中的控件全部有源代码示范学习为主。 1.Calendar组件(日历组件) 2.ChildWindow组件(子窗体组件) 3.浮动窗体组件 4.GridSplitter组件 5.TabControl组件 6-7-8.TreeView组件 9.DtarGrid 10.强大的...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    8.8.1 Struts Prepare And Execute Filter过滤器 8.8.2 struts.xml文件配置出错 8.9 精彩回顾 第9章 庖丁解牛 ——揭密Struts2高级技术 9.1 本章学习任务 9.1.1 本章知识体系 9.1.2 实例开发任务 9.2 OGNL表达式...

    Android入门到精通源代码.

    《Android从入门到精通》 第1章 初识Android 1.1 什么是Android 1.1.1 移动信息设备分类 1.1.2 Open Handset Alliance和 Android 1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术...

    分布式存储极致性能Redis6视频.zip

    23_布隆过滤器BloomFilter理论知识 24_布隆过滤器理论复习 25_缓存雪崩 26_缓存穿透和bloomFilter-helloworld 27_Guava解决缓存穿透 28_Redis布隆过滤器解决缓存穿透 29_docker安装rebloom 30_缓存击穿简介 31_高...

    Android 4游戏编程入门经典

     4.1.8 市场过滤器  4.1.9 定义游戏图标  4.2 android api基础  4.2.1 创建测试项目  4.2.2 活动的生命周期  4.2.3 处理输入设备  4.2.4 文件处理  4.2.5 音频编程  4.2.6 播放音效  4.2.7 音乐流  4.2.8...

    jQuery权威指南366页完整版pdf和源码打包

    2.2.5 可见性过滤选择器 2.2.6 属性过滤选择器 2.2.7 子元素过滤选择器 2.2.8 表单对象属性过滤选择器 2.2.9 表单选择器 2.3 综合案例分析—导航条在项目中的应用 2.3.1 需求分析 2.3.2 效果界面 ...

    android游戏编程入门

     4.1.8 市场过滤器 86  4.1.9 定义游戏图标 87  4.2 Android API基础 87  4.2.1 创建测试项目 88  4.2.2 活动的生命周期 91  4.2.3 处理输入设备 96  4.2.4 文件处理 110  4.2.5 音频编程 116  4.2.6 播放...

    U3DLearn_5.3.6.zip

    第 16 课:网格组件之网格过滤器和渲染器 第 17 课 : 函数之函数重载 第 18 课 : 函数之高级参数 第 19 课 : 函数之递归调用 第 19 课 : PC 端游戏打包与发布 第 20 课 : C# 语法基础总结 第 20 课 :...

    jQuery权威指南-源代码

    9.5 综合案例分析—使用jQuery扩展工具函数实现对字符串指定类型的检测/305 9.5.1 需求分析/305 9.5.2 效果界面/305 9.5.3 功能实现/306 9.5.4 代码分析/309 9.6 本章小结/311 第10章 jQuery性能优化与最佳...

    黑客反汇编揭秘(第二版).part2.rar

    第4章 汇编器入门 46 4.1 汇编语言方法论 47 4.2 基于C程序实例解释汇编概念 48 4.3 汇编插入语句 49 4.4 可用的汇编语言工具 50 4.5 汇编编译器的概况与比较 51 4.5.1 评判的基本标准 52 4.5.2 MASM 54 ...

    黑客反汇编揭秘(第二版).part1.rar

    第4章 汇编器入门 46 4.1 汇编语言方法论 47 4.2 基于C程序实例解释汇编概念 48 4.3 汇编插入语句 49 4.4 可用的汇编语言工具 50 4.5 汇编编译器的概况与比较 51 4.5.1 评判的基本标准 52 4.5.2 MASM 54 ...

    ESM_ArcSight控制台用户指南(中文翻译版—Zephyr)_6.11.0 .pdf

    第一章 入门 1 启动 ARCSIGHT 控制台 1 快速启动工具和标准内容 1 用例 2 第二章 在控制台中工作 3 导航 3 "导航器" 面板资源树 4 批量编辑 6 批量编辑案例或连接器 6 锁定案例组 7 SmartConnector提醒 7 重新连接到...

    黑马程序员安卓Android52期培训课

    2015/1/6 星期二 javaWeb之过滤器 2015/1/7 星期三 javaWeb之文件上传和下载 2015/1/8 星期四 2015/1/9 星期五 框架学习之java基础加强 2015/1/10 星期六 巩固知识之项目实战(指导老师:) 2015/1/11 星期日 2015/...

    程序员的SQL金典.rar

    通过对实际案例开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容简介 本书主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析。本书分为3部分:...

    Reversing:逆向工程揭密

    2.4 编译器和编译入门 53 2.4.1 定义编译器 54 2.4.2 编译器架构 55 2.4.3 列表文件 58 2.4.4 专用编译器 59 2.5 执行环境 60 2.5.1 软件执行环境(虚拟机) 60 2.5.2 现代处理器的硬件执行环境 63 2.6 结论 68 第3...

Global site tag (gtag.js) - Google Analytics