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

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

 

一、代码组成与说明

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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值