解决全站乱码的过滤器实现-包装类设计模式的应用
来源:互联网 发布:选择旅行社的软件 编辑:程序博客网 时间:2024/05/21 09:02
package myself.study.filter;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
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;
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 {
public void init(FilterConfig filterConfig) throws ServletException {
}
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//全站乱码解决过滤器
//>响应正文乱码
response.setContentType("text/html;charset=utf-8");
//>请求参数乱码(使用装饰设计模式对request对象中的获取参数的方法进行改造)
HttpServletRequest res = (HttpServletRequest) request;
MyHttpServletRequest myRes = new MyHttpServletRequest(res);
//放行过滤器
chain.doFilter(myRes, response);
}
FilterChain chain) throws IOException, ServletException {
//全站乱码解决过滤器
//>响应正文乱码
response.setContentType("text/html;charset=utf-8");
//>请求参数乱码(使用装饰设计模式对request对象中的获取参数的方法进行改造)
HttpServletRequest res = (HttpServletRequest) request;
MyHttpServletRequest myRes = new MyHttpServletRequest(res);
//放行过滤器
chain.doFilter(myRes, response);
}
public void destroy() {
}
}
}
}
//使用装饰设计模式对request对象中的获取参数的方法进行改造
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
private boolean isEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
public String getParameter(String name) {
return getParameterValues(name) == null? null : getParameterValues(name)[0];
}
public String[] getParameterValues(String name) {
return getParameterMap().get(name);
}
public Map<String, String[]> getParameterMap() {
try {
//把map中的所有参数值取出来手动编解码, 再存回map
String method = request.getMethod();
if("POST".equals(method)){ //对post请求 的处理
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
}else if("GET".equals(method)){ //对get请求的处理
//把map中的所有参数值取出来手动编解码, 再存回map
Map map = request.getParameterMap();
if(isEncode){
Set<Map.Entry<String, String[]>> set = map.entrySet();
for (Map.Entry<String, String[]> entry : set) {
String[] vs = entry.getValue();
for (int i = 0; i < vs.length; i++) {
vs[i] = new String(vs[i].getBytes("iso8859-1"), "utf-8");
}
}
isEncode = false;
}
return map;
}else{ //其他5种方式, 不处理原样返回
return request.getParameterMap();
}
//return map(没有乱码数据的map)
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
private boolean isEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
public String getParameter(String name) {
return getParameterValues(name) == null? null : getParameterValues(name)[0];
}
public String[] getParameterValues(String name) {
return getParameterMap().get(name);
}
public Map<String, String[]> getParameterMap() {
try {
//把map中的所有参数值取出来手动编解码, 再存回map
String method = request.getMethod();
if("POST".equals(method)){ //对post请求 的处理
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
}else if("GET".equals(method)){ //对get请求的处理
//把map中的所有参数值取出来手动编解码, 再存回map
Map map = request.getParameterMap();
if(isEncode){
Set<Map.Entry<String, String[]>> set = map.entrySet();
for (Map.Entry<String, String[]> entry : set) {
String[] vs = entry.getValue();
for (int i = 0; i < vs.length; i++) {
vs[i] = new String(vs[i].getBytes("iso8859-1"), "utf-8");
}
}
isEncode = false;
}
return map;
}else{ //其他5种方式, 不处理原样返回
return request.getParameterMap();
}
//return map(没有乱码数据的map)
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
web.xml中的配置
<filter>
<description>全站乱码解决过滤器</description>
<filter-name>EncodingFilter</filter-name>
<filter-class>myself.study.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<description>全站乱码解决过滤器</description>
<filter-name>EncodingFilter</filter-name>
<filter-class>myself.study.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
阅读全文
0 0
- 解决全站乱码的过滤器实现-包装类设计模式的应用
- 过滤器和包装类设计模式的应用
- 过滤器-用包装类解决全站乱码
- 【过滤器】(5)过滤器的应用案例:全站压缩技术(包装模式)
- 过滤器的应用之全站乱码解决--Filter(二)
- 关于Filter解决全网乱码问题的总结 --- 包装类 编解码 过滤器
- 过滤器应用之解决全站乱码
- 解决全站乱码过滤器
- 全站乱码解决过滤器
- 过滤器解决全站乱码
- 过滤器应用之解决全站中文乱码问题
- [javaweb]Java过滤器与包装设计模式的实用案例.
- javaweb 过滤器的应用解决乱码问题
- 全站压缩---(装饰模式、过滤器的应用)
- JavaWeb学习篇——使用过滤器及装饰器设计模式解决全站乱码问题
- 【过滤器】(4)过滤器的应用案例:留言板敏感词过滤技术(包装模式)
- 过滤器Filter的案例3——解决全站的请求数据乱码问题
- 字符过滤器,解决全站乱码
- 深入理解Cocos2d-x的anchorPoint锚点和scale缩放之间的配合方式
- 第6章 内部类、匿名内部类
- [LeetCode]1. Two Sum
- h5、js最详细的正则检验手机号码
- 一元隐函数及其求导
- 解决全站乱码的过滤器实现-包装类设计模式的应用
- socket-详细分析No buffer space available
- 用ASM直接读取字节码来加载Class的Annotation
- PXE+Kickstart无人值守安装CentOS 7出现DHCP故障解决报告
- linux 常用命令
- 冒泡排序 大的在上
- 查找算法之二分查找
- java并发中的Semaphore
- 174. Dungeon Game