小工具      在线工具  汉语词典  css  js  c++  java

利用java动态代理处理中文乱码

Java 额外说明

收录于:42天前

1、在过滤器(MyFilter)中添加动态代理代码,生成增强请求(处理乱码),然后通过链(请求、响应)释放。

2、当发起接口请求时,ServletDemo1中的doGet(HttpServletRequest request, HttpServletResponse response)会自动执行。这里接收到的请求就是上面的增强请求,从而实现了通过JDK动态代理处理乱码的问题。

3、源码如下:

package cn.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;


public class MyFilter implements Filter
{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 要增强的方法:request.getParameter
		// 被代理的对象: request
		
		final HttpServletRequest request=(HttpServletRequest)req;
		
		// 动态的生成代理对象
		HttpServletRequest hsr=(HttpServletRequest)Proxy.newProxyInstance(
				request.getClass().getClassLoader(), 
				request.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						
						// 1 判断是否是需要增强的方法 getParameter
						if("getParameter".equals(method.getName()))
						{
							// 知道getParameter使用的是哪个提交方式 
							String m = request.getMethod();
							// 判断是get还是post
							if("get".equalsIgnoreCase(m))
							{
								// 以前方法调用后的乱码
								String s =(String)method.invoke(request, args);
								// 增强--解决乱码
								s=new String(s.getBytes("iso8859-1"),"utf-8");
								return s;
							}
							
							if("post".equalsIgnoreCase(m))
							{
								request.setCharacterEncoding("utf-8");
								
							}
						}
						
						// 如果是别的方法
						return method.invoke(request, args);
					}
				});
		
		// 放行
		chain.doFilter(hsr, response);
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}
package cn.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletDemo1
 */

public class ServletDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		System.out.println(username);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

. . .

相关推荐

额外说明

Android中Listview适配器的优化编写方法

需求分析:适配器常用的LayoutInflater.inflate()方法,转化资源文件,执行一次,极耗资源。每次加载页面都要重新调用,未免太过浪费。 解决思路:利用ViewHolder来缓存必要的资源,减少inflate的调用次数,从而节省资源。 关键

额外说明

【Web前端开发】CSS定位

文章目录 1.定位介绍 2.定位的方式 2.1 相对定位 2.2 绝对定位 2.2.1 子绝父相 2.3 固定定位 3. 元素的层级关系 4. 总结 1.定位介绍 定位有两个作用: 1.可以解决盒子和盒子之间的层叠问题 (定位之后元素层级最高,可以层叠在

额外说明

【C语言】牛客网小测验-单链表遍历与求和

文章目录 前言 单链表的遍历 单链表的求和 前言 我们在学习编程的过程中,虽然有些语法很简单,但是我们还是要做多题。不做题是发现不了问题的,发现问题我们就可以“对症下药”,进行查漏补缺了。刷题可以先从简单题开始刷,熟练之后再做一些可以提升自己能力的题。今

额外说明

【C语言】qsort()函数详解

前言: 作者简介:爱吃大白菜1132 人生格言:纸上得来终觉浅,绝知此事要躬行   如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!   如果觉得博主文章还不错的话,希望三连支持! 目录 1、qsort概念介绍 2、qsort()函数实现(

额外说明

Java项目防止SQL注入的四种方案

-1. 什么是SQL注入? SQL注入(SQL Injection)是一种代码注入技术,是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。简单来说,SQL注入攻击者通过把SQL命令插入到Web

额外说明

Python实现机器学习(上)— 基础知识介绍及环境部署

前言:Hello大家好,我是小哥谈。本门课程将介绍人工智能相关概念,重点讲解机器学习原理机器基本算法(监督学习及非监督学习)。使用python,结合sklearn、Pycharm进行编程,介绍iris(鸢尾花)数据集,建立AI模型并评估其表现。本节课主要

额外说明

springboot整合ehcache+redis实现双缓存

在一些对并发业务要求较高的场景下,对页面数据的响应是个急需解决的问题,对后端来说,ehcache+redis实现双缓存是解决这一问题的不错思路,而且在不少的电商项目中得到了很好的验证,但我在网上搜寻资料的时候总觉得一些材料不能很好的说明这个问题,要么太复

额外说明

项目一:初探Spring框架

文章目录 一、Web开发技术 二、Spring框架 (一)Spring官网 (二)Spring框架优点 (三)为什么要选择Spring? (四) Spring框架因何而来 (五)Spring框架核心概念 1、IoC(Inversion of Contro

额外说明

Python基础

来源与安装  Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。 Python 是一种解释

额外说明

[设计模式-创建型]抽象工厂(Abstract Factory)

概括 名称 Abstract Factory 结构 动机 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 适用性 一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一系列相关的产品

ads via 小工具