解决全站的请求数据乱码问题--动态代理方式
来源:互联网 发布: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>
- 解决全站的请求数据乱码问题--动态代理方式
- 过滤器Filter的案例3——解决全站的请求数据乱码问题
- 过滤器-用动态代理解决全站乱码
- 动态代理解决表单提交的中文乱码问题
- javaEE动态代理解决乱码问题
- 动态代理解决全局乱码问题
- 用过滤器解决全站中文数据提交乱码问题
- 用动态代理去解决get乱码后经过转发又变为乱码的问题
- get请求的乱码解决方式
- 解决get请求方式乱码的方法
- 使用Volley请求数据,并使用Gson解析(解决请求来的数据乱码问题)
- get 方式请求乱码以及用Jquery ajax 乱码问题的解决;
- JAVA反射(四)之动态代理解决全局乱码问题
- 动态代理解决中文乱码
- 解决URL请求的中文乱码问题
- 解决Get请求中文乱码的问题
- javaweb 解决请求相应的乱码问题
- Filter 解决全站中文乱码问题
- Python 邻接矩阵实现无向图、有向图的三种方法,并绘图显示
- 轻松学习的技巧
- MFC如何给按钮加图标
- 2017开学训练第十一周周末总结
- VQ(vector quantization) record
- 解决全站的请求数据乱码问题--动态代理方式
- 表单
- 打印对称型三角形
- Linux趣事 -- (2.5)学生信息管理系统
- Linux(CentOS 6.8)系统安装Nginx的方法,简单易用!
- jersey restful代码实例(多种参数类型)
- 数据结构(1)-线性表
- 拆分配置文件
- 2017.11.12笔记