解决全站的请求数据乱码问题--动态代理方式

来源:互联网 发布:php魔术方法isset() 编辑:程序博客网 时间:2024/06/08 08:27

解决全站的请求数据乱码问题--动态代理方式

 

一、代码组成与说明

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(){@Overridepublic 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);//设置编码后,返回相应的方法进行调用    }elsereturn method.invoke(req, args);//其它请求是,直接返回当前方法的调用}});//代理模式进行//代理reqProxy  --》reqchain.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>


原创粉丝点击