Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解决全站字符乱码

解决全站字符乱码

作者头像
星哥玩云
发布于 2022-09-14 13:19:41
发布于 2022-09-14 13:19:41
34000
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

1、解决全站字符乱码(POST和GET中文编码问题)

servlet:

  • POST:request.setCharacterEncoding(“utf-8”);
  • GET: String username = request.getParameter(“username”); username = new String(username.getBytes(“ISO-8859-1”), “utf-8”);

2、说明

乱码问题:

获取请求参数中的乱码问题;

​ POST请求:request.setCharacterEncoding(“utf-8”);

​ GET请求:new String(request.getParameter(“xxx”).getBytes(“iso-8859-1”), “utf-8”);

响应的乱码问题:response.setContextType(“text/html;charset=utf-8”)。

基本上在每个Servlet中都要处理乱码问题,所以应该把这个工作放到过滤器中来完成。

3、分析

其实全站乱码问题的难点就是处理GET请求参数的问题。

如果只是处理POST请求的编码问题,以及响应编码问题,那么这个过滤器就太!太!太简单的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EncodingFilter extends HttpFilter {
	public void doFilter(HttpServletRequest request,
			HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		String charset = this.getInitParameter("charset"); 
		if(charset == null || charset.isEmpty()) {
			charset = "UTF-8";
		}
 		request.setCharacterEncoding(charset); 
		response.setContentType("text/html;charset=" + charset); 
		chain.doFilter(request, response);
	}
}

如果是POST请求,当执行目标Servlet时,Servlet中调用request.getParameter()方法时,就会根据request.setCharacterEncoding()设置的编码来转码!这说明在过滤器中调用request.setCharacterEncoding()方法会影响在目标Servlet中的request.getParameter()方法的行为!

但是如果是GET请求,我们又如何能影响request.getParameter()方法的行为呢?这是不好做到的!我们不可能先调用request.getParameter()方法获取参数,然后手动转码后,再施加在到request中!因为request只有getParameter(),而没有setParameter()方法。

处理GET请求参数编码问题,需要在Filter中放行时,把request对象给“调包”了,也就是让目标Servlet使用我们“调包”之后的request对象。这说明我们需要保证“调包”之后的request对象中所有方法都要与“调包”之前一样可以使用,并且getParameter()方法还要有能力返回转码之后的参数。

这可能让你想起了“继承”,但是这里不能用继承,而是“装饰者模式(Decorator Pattern)”!

下面是三种对a对象进行增强的手段:

l 继承:AA类继承a对象的类型:A类,然后重写fun1()方法,其中重写的fun1()方法就是被增强的方法。但是,继承必须要知道a对象的真实类型,然后才能去继承。如果我们不知道a对象的确切类型,而只知道a对象是IA接口的实现类对象,那么就无法使用继承来增强a对象了;

l 装饰者模式:AA类去实现a对象相同的接口:IA接口,还需要给AA类传递a对象,然后在AA类中所有的方法实现都是通过代理a对象的相同方法完成的,只有fun1()方法在代理a对象相同方法的前后添加了一些内容,这就是对fun1()方法进行了增强;

l 动态代理:动态代理与装饰者模式比较相似,而且是通过反射来完成的。动态代理会在最后一天的基础加强中讲解,这里就不再废话了。

对request对象进行增强的条件,刚好符合装饰者模式的特点!因为我们不知道request对象的具体类型,但我们知道request是HttpServletRequest接口的实现类。这说明我们写一个类EncodingRequest,去实现HttpServletRequest接口,然后再把原来的request传递给EncodingRequest类!在EncodingRequest中对HttpServletRequest接口中的所有方法的实现都是通过代理原来的request对象来完成的,只有对getParameter()方法添加了增强代码!

JavaEE已经给我们提供了一个HttpServletRequestWrapper类,它就是HttpServletRequest的包装类,但它做任何的增强!你可能会说,写一个装饰类,但不做增强,其目的是什么呢?使用这个装饰类的对象,和使用原有的request有什么分别呢?

HttpServletRequestWrapper类虽然是HttpServletRequest的装饰类,但它不是用来直接使用的,而是用来让我们去继承的!当我们想写一个装饰类时,还要对所有不需要增强的方法做一次实现是很心烦的事情,但如果你去继承HttpServletRequestWrapper类,那么就只需要重写需要增强的方法即可了。

4、代码

EncodingRequest

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EncodingRequest extends HttpServletRequestWrapper  {
	private String charset;
	public EncodingRequest (HttpServletRequest request, String charset) {
		super(request);
		this.charset = charset;
	}

	public String getParameter (String name) {
		HttpServletRequest request  = (HttpServletRequest) getRequest();
		
		String method = request.getMethod() ;
		if(method.equalsIgnoreCase("post ")) {
			try {
				request.setCharacterEncoding(charset); 
			} catch (UnsupportedEncodingException e) {}
		} else if(method.equalsIgnoreCase("get ")) {
			String value = request.getParameter(name); 
			try {
				value = new String(name.getBytes("ISO-8859-1"), charset); 
			} catch (UnsupportedEncodingException e) {
			}
			return value ;
		}
		return request.getParameter(name);
	}
}

EncodingFilter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EncodingFilter extends HttpFilter {
	public void doFilter(HttpServletRequest request,
			HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		String charset = this.getInitParameter("charset"); 
		if(charset == null || charset.isEmpty()) {
			charset = "UTF-8";
		} 
		response.setCharacterEncoding(charset);
		response.setContentType("text/html;charset=" + charset);
		EncodingRequest res = new EncodingRequest(request, charset); 
		chain.doFilter(res, response); 
	}
}

web.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>cn.itcast.filter.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>charset</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
javaWeb核心技术第十篇之Filter
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/08/27
3850
过滤器Filter精华知识点,怎能不看 ​
过滤器Filter 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。 当用户请求某个Servlet时,会先执行部署在这个请求
Java帮帮
2018/03/19
9770
过滤器Filter精华知识点,怎能不看 ​
POST和GET方法乱码解决方案
前言 在WEB开发的过程中,中文乱码是最为常见的问题之一。之所以会出现中文乱码的情况,主要原因是:前端使用POST或者GET方法传递的参数一般使用浏览器预先设置的编码方式进行编码,中文浏览器一般是使用UTF8或者GBK,英文的一般是ISO编码;而浏览器编码完成后发送给服务器,服务器进行解码的解码方式默认是使用ISO8859-1。这就造成了编码和解码方式不统一的,进而出现了中文乱码的问题。 在下面,我将给出分别对POST、GET方法乱码的解决方案 对POST方法和GET方法的简介 POST方法和GET方法是前
roobtyan
2018/06/04
3.9K0
JavaWeb常见的乱码问题解决方案总结
-Dfile.encoding=GBK 或者Dfile.encoding=UTF-8
乐心湖
2020/07/31
3030
JavaWeb常见的乱码问题解决方案总结
Filter
过滤器是实现了Filter接口的一个java类,是Servlet的高级应用,可以处理request和response,该接口有下面三种方法
晚上没宵夜
2020/03/10
1K0
servlet乱码问题总结
在学习时servlet乱码问题还是挺严重的,总结一下有三种情况  1.新建HTML页面后浏览出现乱码 2.以post形式请求时出现乱码 3.以get形式请求时出现乱码 让我们一个一个来解决吧 1.新建HTML页面后浏览出现乱码 <!DOCTYPE html> <html> <head> <title>乱码示例</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="d
lpxxn
2018/01/31
7890
servlet乱码问题总结
SpringMVC系列知识:(六)乱码的问题
我们前段传到后端的是中文,前段也是utf-8。但是在后端接收到的就是乱码。这个不是前段的问题,是后端的java代码出现了问题。我们可以在controller层输出一下接收到的前段数据,就可以看到输出的是乱码。所以,我们解决的时候就是在controller层解决乱码的问题。
一写代码就开心
2020/11/19
4000
JavaWeb-过滤器Filter学习(四)敏感词过滤实例
思路很简单,我们这里的敏感词是直接先放进去的,实际项目中,肯定是存在数据库中。在Filter 过滤器中,我们先拿到用户提交的留言,如果出现了敏感词,我们就用*号来替换。
谙忆
2021/01/21
8830
JavaWeb-过滤器Filter学习(四)敏感词过滤实例
Web-第十八天 过滤器Filter【悟空教程】
在完成登录时,如果用户勾选“自动登录”,将在下次登录时,自动完成登录功能,减少用户再次输入账号和密码繁琐的操作。此功能是对用户的操作体验进行优化,本案例将带领大家完成此功能。效果图如下:
Java帮帮
2018/07/27
7160
Web-第十八天 过滤器Filter【悟空教程】
Javaweb之Filter案例练习-项目全局编码过滤器
先创建一个叫GlobalFilter的web动态项目,把前面文章出现过的login.jsp复制过来,改成如下代码。
凯哥Java
2019/08/18
4060
Javaweb之Filter案例练习-项目全局编码过滤器
组件必知必会|那些年我们使用过的轮子—Filter和Proxy
过滤器Filter是JavaWeb三大组件之一,它与Servlet很相似,过滤器是用来拦截请求的,而不是处理请求的。当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter“不放行”,那么就不会执行用户请求的Servlet。可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
浅羽技术
2020/12/07
3060
组件必知必会|那些年我们使用过的轮子—Filter和Proxy
[javaweb]Java过滤器与包装设计模式的实用案例.
在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。 一、Decorator设计模式 1.1、Decorator设计模式介绍   当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法。 使用Decorator设计模式对方法进行增强。   在阎宏博士的《JAVA与模式》一书中开头是这样描述装
一枝花算不算浪漫
2018/05/18
1.1K0
从0到1搭建完整的javaweb项目(超详细)
本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。
程序员小猿
2021/01/18
1.9K0
从0到1搭建完整的javaweb项目(超详细)
java过滤器Filter「建议收藏」
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应 (Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的 web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过代码示例来了解它 的使用。
全栈程序员站长
2022/06/27
5610
完整的java项目_手把手搭建一个完整的javaweb项目
本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。
全栈程序员站长
2022/09/08
2.4K0
完整的java项目_手把手搭建一个完整的javaweb项目
重定向和转发|数据处理|乱码问题
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .
后端码匠
2021/08/20
6530
day17_Listener与Filter学习笔记
    事件:就是一个事情。     事件源:产生这个事情的源头。     监听器:用于监听指定的事件的对象。(关联事件和事件源)     注册监听:要想让监听器可以监听到事件产生,必须对其进行注册。
黑泽君
2018/10/11
4010
day17_Listener与Filter学习笔记
JavaWeb19-Listener ; Filter
Listener & Filter一.Listener 1. listener介绍 Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext 作用: 监听web对象的创建与销毁 监听web对象的属性变化 监听session绑定javaBean操作 监听机制的相关概念 事件----一件事情 事件源---产生这件事情的源头 注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。 监听器---对某件事情进行
Java帮帮
2018/03/19
8270
JavaWeb19-Listener ; Filter
JSP的6种乱码解决方案[通俗易懂]
3.查看项目的编码格式:设置为UTF-8 :project–》properties:
全栈程序员站长
2022/08/04
1.1K0
JSP的6种乱码解决方案[通俗易懂]
JavaWeb 乱码问题终极解决方案!
首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要做的第一件事就是确认乱码发生的位置,缩小 bug 范围,通过打印日志或者 debug 首先去确认乱码发生的位置,然后再去进一步解决,一般来说,乱码的原因大致上可以分为两类:
江南一点雨
2019/08/30
1.3K0
JavaWeb 乱码问题终极解决方案!
相关推荐
javaWeb核心技术第十篇之Filter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验