博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
过滤器解决get和post方式提交的中文乱码
阅读量:6395 次
发布时间:2019-06-23

本文共 2153 字,大约阅读时间需要 7 分钟。

hot3.png

        对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。

       如果不使用过滤器的话,在每个servlet中都要进行设置编码,如果是post请求还好,但是如果是get请求,就要手动进行转码,相当麻烦。
        下面来介绍一下过滤器解决表单提交中的中文乱码问题。

        过滤器,顾名思义就是过滤用的,它可以在请求、响应、或者servlet中请求转发等操作发生时先进行执行,之后程序再往下执行,这里起到一个过滤的作用。

    平常在 servlet 中接受请求的数据时可以使用 request.getParameter(name) 或者 request.getParameterValues(name) 进行获取,但这些方法如果不进行编码设置时,得到的数据都是乱码,这是因为浏览器传过来的数据的编码格式是iso-8859-1,而我们的开发平台一般都是使用的是utf-8,所以就会出现乱码现象。

       这时也就是说request.getParameter(name)这些方法满足不了我们当前的需求,此时我们可以利用装饰者设计模式对这些方法进行增强。

    而为了方便程序员对HttpServletRequest 进行包装,javaEE中就已经提供好了一个基类HttpServletRequestWrapper这个类中已经实现其他需要实现的接口,我们只需要编写一个自己的类例如MyRequest继承它,需要增强哪个方法,就对哪个方法进行重写就行,没有重写的方法原来是如何执行的现在还会如何执行。

下面是具体代码实现过程:

public class MyRequest extends HttpServletRequestWrapper{		HttpServletRequest request=null;		public MyRequest(HttpServletRequest request) {		super(request);		this.request = request;	}		@Override	public String getParameter(String name) {				String method = request.getMethod();		String value=null;		try {			request.setCharacterEncoding("utf-8");						value = request.getParameter(name);						if("get".equalsIgnoreCase(method)){				value = new String(value.getBytes("iso-8859-1"),"utf-8");			}		} catch (Exception e) {				e.printStackTrace();		}				return value;	}			@Override	public String[] getParameterValues(String name) {				String method = request.getMethod();		String[] values=null;		try {			request.setCharacterEncoding("utf-8");						values = request.getParameterValues(name);						if("get".equalsIgnoreCase(method)){				int i=0;				for (String str : values) {					values[i++] = new String(str.getBytes("iso-8859-1"),"utf-8");				}			}		} catch (Exception e) {				e.printStackTrace();		}				return values;	}	}

        过滤器中的代码实现,需要注意的是,在过滤器中放行传入的request对象,是我们经过增强后的MyRequest对象。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {				HttpServletRequest request = (HttpServletRequest) req;		HttpServletResponse response = (HttpServletResponse) resp;				MyRequest myRrequest = new MyRequest(request);				chain.doFilter(myRrequest, response);	}

        使用过滤器后,这样在用servlet接受浏览器传过来的数据时,就不用考虑乱码的问题,过滤器已经帮我们解决了。

转载于:https://my.oschina.net/u/2321708/blog/1543869

你可能感兴趣的文章
Android 中 动画效果实现
查看>>
Mysql 在 order by 时索引的使用机制
查看>>
MapXtreme 2005 学习心得 了解新建MapXtreme项目结构(二)
查看>>
ElasticSearch的查询相关操作---使用es的api和结果遍历
查看>>
解决error:2014 Commands out of sync; you can't ru...
查看>>
glibc的安装编译 --完整处理问题版
查看>>
win7:基于nginx tomcat redis分布式web应用的session共享配置实验
查看>>
基于PHP构建OAuth 2.0 认证平台
查看>>
How to: Use SpinLock for Low-Level Synchronization
查看>>
几个java面试题
查看>>
아프리카 BJ 박현서,
查看>>
根据wsdl文件创建spring ws客户端
查看>>
潜语义分析(Latent Semantic Analysis)
查看>>
Java nio 服务器端读取客户端的输入请求
查看>>
网页页面自动刷新的3种代码
查看>>
java集合操作-----求两个集合的交集和并集
查看>>
Schama —— Xml文档约束技术 学习笔记
查看>>
[Apache Spark API][GroupByKey Vs ReduceByKey]
查看>>
网络复习之数据链路层
查看>>
【设计模式】——抽象工厂Abstract Factory
查看>>