解决全站的请求数据乱码问题--动态代理方式
一、代码组成与说明
1、代码组成
index.jsp(页面)+ServletDemo(servlet)+ProxyEncodingFilter (过滤器)+web.xml(配置文件)
2、代码流程
首先,在index.jsp(页面)中的表单中的输入框中输入中文;
然后点击提交后,由ProxyEncodingFilter (过滤器)进行拦截,即:对那些中文的编码问题进行解决;
最后,访问ServletDemo(servlet),获取正确的表单中文数据
3、页面与返回结果
(1)post方式
name:暗示
name2:安慰法
name3:按时发斯蒂芬
(2)get方式
getParameter 工作了。。。。。。。
name:阿斯蒂芬
getParameterValues 工作了。。。。。。。
name2:阿斯顿发放地方
getParameterMap 工作了。。。。。。。
name3:按时发斯蒂芬为
4、代码说明
自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,
(1)对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,
如果未设置,则使用默认的iso-8859-1编码。
(2)而GET请求,则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,
而会永远使用iso-8859-1编码。
注意:以下这种过滤器,适用于:
当tomcat服务器的编码没有改变过时,get请求默认使用iso-8859-1编码的情况
<Connectorport="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
备注:如果想看装饰器与过滤器结合,进行解决全站的请求数据乱码问题的案例,
请看本人的博文:过滤器Filter的案例3——解决全站的请求数据乱码问题
网址:http://blog.csdn.net/a15920804969/article/details/78280900
二、代码详细
1、index.jsp(页面)
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<body>
post方式
<form action="${pageContext.request.contextPath}/servletDemo" method="post">
用户名1<input type="text"name="name"><br/>
用户名2<input type="text"name="name2"><br/>
用户名3<input type="text"name="name3"><br/>
<input type="submit"value="提交">
</form>
get方式
<form action="${pageContext.request.contextPath}/servletDemo" method="get">
用户名1<input type="text"name="name"><br/>
用户名2<input type="text"name="name2"><br/>
用户名3<input type="text"name="name3"><br/>
<input type="submit"value="提交">
</form>
</body>
</html>
2、ServletDemo(servlet)
package proxy3;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");//获取参数方式一
System.out.println("name:"+name);
String[] values = request.getParameterValues("name2");//获取参数方式二
System.out.println("name2:"+values[0]);
Map<String, String[]> map = request.getParameterMap();//获取参数方式三
String[] mp=map.get("name3");
System.out.println("name3:"+mp[0]);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");//获取参数方式一
System.out.println("name:"+name);
String[] values = request.getParameterValues("name2");//获取参数方式二
System.out.println("name2:"+values[0]);
Map<String, String[]> map = request.getParameterMap();//获取参数方式三
String[] mp=map.get("name3");
System.out.println("name3:"+mp[0]);
}
}
3、ProxyEncodingFilter (过滤器)
package proxy3;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
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.HttpServletResponse;
/*
*
* 自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,
(1)对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,
如果未设置,则使用默认的iso-8859-1编码。
(2)而GET请求,则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,
而会永远使用iso-8859-1编码。
注意:以下这种过滤器,适用于:
当tomcat服务器的编码没有改变过时,get请求默认使用iso-8859-1编码的情况
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
*/
public class ProxyEncodingFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//拦截处理代码
final HttpServletRequest req=(HttpServletRequest)request;
final HttpServletResponse resp=(HttpServletResponse)response;
ClassLoader loader = ProxyEncodingFilter.class.getClassLoader();
Class<?>[] interfaces = req.getClass().getInterfaces();
// Class<?>[] interfaces = HttpServletRequest.class.getInterfaces();
HttpServletRequest reqProxy=(HttpServletRequest) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//当前请求方式是get的时候
//使用错误原因:
//if(req.getMethod().equals("get"))
//正确使用:忽略大小写
if(req.getMethod().equalsIgnoreCase("get")){
// String name = request.getParameter("name");//获取参数方式一
// String[] values = request.getParameterValues("name");//获取参数方式二
// Map<String, String[]> map = request.getParameterMap();//获取参数方式三
//一个String值
if(method.getName().equals("getParameter")){
System.out.println("getParameter 工作了。。。。。。。");
//手动去解决乱码的问题
String value = (String) method.invoke(req, args);
//此处相当于String value = request.getParameter("name")
if(value==null){return null;}
return new String(value.getBytes("iso8859-1"),"utf-8");
//返回处理后的value
// return new String(value.getBytes("UTF-8"), "UTF-8");
}
//一个数组
if(method.getName().equals("getParameterValues")){
System.out.println("getParameterValues 工作了。。。。。。。");
String[] values = (String[]) method.invoke(req, args);
//此处相当于String[] values = request.getParameterValues("name");
if(values.length==0){return null;}
for(int i=0;i<values.length;i++){
values[i]=new String(values[i].getBytes("iso8859-1"),"utf-8");
// values[i]=new String(values[i].getBytes("utf-8"),"utf-8");
}
return values;//返回处理后的values
}
//一个map处理
if(method.getName().equals("getParameterMap")){
System.out.println("getParameterMap 工作了。。。。。。。");
Map<String, String[]> map=(Map<String, String[]>) method.invoke(req, args);
//此处相当于Map<String, String[]> map = request.getParameterMap();
Map<String, String[]> newMap=new HashMap<String,String[]>();
//创建一个新的map,用于存储处理编码后的数据,然后返回
if(map.size()==0){
return null;
}
//对需要处理的map进行遍历处理
Set<String> keySet=map.keySet();
for(String key:keySet){
String[] values=map.get(key);
for(int i=0;i<values.length;i++){
values[i]=new String(values[i].getBytes("iso8859-1"),"utf-8");
// values[i]=new String(values[i].getBytes("utf-8"),"utf-8");
}
newMap.put(key, values);//处理后的数据存入map中
}
return newMap;//返回处理后的map
}
return method.invoke(req, args);//其它请求是,直接返回当前方法的调用
}
//当前请求方式是post的时候
//else if(req.getMethod().equals("post")) 使用错误
else if(req.getMethod().equalsIgnoreCase("post")){
//解决post请求中文乱码问题
req.setCharacterEncoding("UTF-8");
return method.invoke(req, args);//设置编码后,返回相应的方法进行调用
}
else
return method.invoke(req, args);//其它请求是,直接返回当前方法的调用
}});
//代理模式进行
//代理reqProxy --》req
chain.doFilter(reqProxy, response);//放行
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
4、web.xml(配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>proxy3.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/servletDemo</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ProxyEncodingFilter</filter-name>
<filter-class>proxy3.ProxyEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ProxyEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>