`
ren2881971
  • 浏览: 110004 次
社区版块
存档分类
最新评论

HttpServletRequestWrapper两个类学习总结(有关中文乱码的例子)

    博客分类:
  • j2ee
 
阅读更多
在学习javax.servlet.http包中发现两个类:
HttpServeltRequestWrapper
HttpServletResponseWrapper:
这两个类的方法跟HttpServletRequest/HttpServletResponse的方法基本相同。
可以理解为这两个类是包装类。
可以按照业务需求重写里面的方法,然后将request/response进行包装后,满足具体功能。
实际用例:
过滤中文参数乱码。
具体思路是:
建立filter过滤器和自定义包装类。
在filter过滤的时候对request和response进行过滤和包装,起到让乱码转换成中文的功能。
代码如下:
package demo.filter;

import java.io.IOException;

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 demo.wrapper.MyHttpServletRequestWrapper;

public class ContentTypeFilter implements Filter {

	private String charset = "UTF-8";
	private FilterConfig config;

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println(config.getFilterName() + "被销毁");
		charset = null;
		config = null;

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
		//response.setContentType("text/html;charset=UTF-8");
		HttpServletRequest req = (HttpServletRequest) request;
		if (req.getMethod().equalsIgnoreCase("get")) {

			req = new MyHttpServletRequestWrapper(req, charset);
		}
		System.out.println("----请求被" + config.getFilterName() + "过滤");
		chain.doFilter(req, response);
		System.out.println("----相应" + config.getFilterName() + "过滤");
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
		String charset = config.getServletContext().getInitParameter("charset");
		if (charset != null && charset.trim().length() != 0) {
			this.charset = charset;
		}

	}

}


package demo.wrapper;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {

	private String charset = "UTF-8";

	public MyHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		// TODO Auto-generated constructor stub
	}

	public MyHttpServletRequestWrapper(HttpServletRequest request,
			String charset) {
		super(request);
		this.charset = charset;
	}

	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);
		value = value == null ? null : convert(value); 
		return value;
	}

	private String convert(String value) {
		System.out.println("编码转换之前:" + value);
		try {
			return new String(value.trim().getBytes("ISO-8859-1"), charset);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			System.out.println("转换失败");
			return value;
		}

	}
}

        <filter>
		<filter-name>ContentTypeFilter</filter-name>
		<filter-class>demo.filter.ContentTypeFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ContentTypeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在完成小例子的时候 要到一个bug就是一直显示乱码。找了半天才发现。
我的包装类的功能实现了。
但是因为没有给jsp和response的ContentType设置utf-8导致的。
response.setContentType("text/html;charset=UTF-8");
分享到:
评论

相关推荐

    HttpServletRequestWrapper

    这是一个关于HttpServletRequestWrapper使用的列子,工作需要,所以传上来的。

    Java关于中文乱码问题的多种解决方法

    在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...

    HttpServletRequestWrapper应用(二):包装文件上传请求

    然而,如果我们需要在上传过程中做一些额外的操作,如验证文件类型、大小限制等,可以创建一个继承自`HttpServletRequestWrapper`的子类,并覆盖相关的方法。 以下是一个简单的例子,展示如何创建一个`...

    HttpServletRequestWrapper 用法

    `HttpServletRequestWrapper`是Java Servlet API中的一个类,它允许我们对`HttpServletRequest`对象进行包装,以便在请求处理过程中添加自定义的行为或者修改默认的行为。这个类位于`javax.servlet.http`包下,是`...

    使用HttpServletRequestWrapper在filter修改request参数

    `HttpServletRequestWrapper` 是Servlet API中的一个抽象类,它是`HttpServletRequest` 的包装类,可以用来扩展或修改原始请求对象的功能。 标题“使用HttpServletRequestWrapper在filter修改request参数”揭示了...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时,中文乱码问题总是会出现。这是因为在编码和解码过程中存在不一致的问题。幸运的是,这个问题可以通过简单的...

    java,jsp,servlet 乱码

    Java、JSP 和 Servlet 乱码问题是一个常见的开发难题,主要涉及到字符编码的不一致,导致数据在不同阶段出现解码错误。以下是一些解决乱码问题的关键知识点: 1. **页面编码设置**: - 静态HTML页面可以通过`...

    Web开发 乱码过滤器.zip

    总结来说,这个压缩包提供了处理Web应用中乱码问题的解决方案,包括了自定义HttpServletRequestWrapper来正确解码GET参数,以及通过字符编码过滤器统一设置请求和响应的编码。这样的做法可以有效避免由于编码不一致...

    jsp中FilterDome(乱码过滤器源代码)

    在处理中文或其他多语言字符时,乱码问题时常出现,`FilterDome`就是为了解决这个问题而设计的。下面将详细介绍`FilterDome`的工作原理、如何解决乱码问题以及在SSH框架中的应用。 1. **乱码问题的来源** 在Web...

    java中Filter过滤器处理中文乱码的方法

    `doFilter()`方法中的两个`if`语句分别设置了请求和响应的字符编码。`init()`方法从web.xml的配置中获取编码参数。 - `web.xml`配置:定义了名为`CharactorFilter`的Filter,并指定了完整的类名`...

    通过过滤器(Filter)解决JSP的Post和Request中文乱码问题

    在Web开发过程中,处理中文乱码问题是一道绕不过的坎。特别是使用Java作为后端开发语言时,中文乱码问题更是常见。其中在Java Server Pages (JSP) 中,Post和Request中文乱码问题尤为突出,经常困扰着开发人员。然而...

    Android编程向服务器发送请求时出现中文乱码问题的解决方法

    首先,我们要理解乱码产生的两个主要原因: 1. **提交参数未进行URL编码**:在使用HTTP的GET方式发送请求时,如果参数值包含中文字符,应当先将其进行URL编码,以符合URL的规范。URL编码是一种将非ASCII字符转换为...

    Request中的参数转实体类

    主要用于使用Request中的getParamterMap()方法生成一个实体类,其中还包括getParamterMap中字段的检查方法。详见内容!

    用Filter来解决中文表单提交问题

    它创建了一个名为`Request`的内部类,该类继承自`HttpServletRequestWrapper`,目的是为了封装原始的`HttpServletRequest`对象并提供额外的功能。`Request`类覆盖了`getParameter()`和`getParameterValues()`方法,...

    过滤器过滤用户输入的非法字符

    本文将深入探讨标题中的两个关键类:`XssFilter.java` 和 `XssHttpServletRequestWrapper.java`,以及它们在过滤非法字符中的作用。 首先,`XssFilter.java` 是一个实现了Servlet过滤器接口(javax.servlet.Filter...

    JSP 中文字符处理代码

    在这个例子中,过滤器类TomcatFormFilter通过继承HttpServletRequestWrapper来包装请求对象,并重写getParameter方法来转换参数的字符编码。 过滤器的核心部分在于: ```java public class TomcatFormFilter ...

    J2EE资源练习多选

    1. **装饰模式的应用**:`HttpServletRequestWrapper`是一个装饰模式的例子。这是正确的,因为它通过继承`HttpServletRequest`接口,并在其上添加新的行为,从而扩展了请求对象的功能。 2. **扩展Servlet请求的功能...

    在使用实现过滤器进行request包装,获取内层request的分析

    `filter`和`manager`这两个文件名可能代表了过滤器相关的其他内容,但没有具体的文件内容,无法给出详细的解释。通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`manager`可能是一个管理多个过滤器的类,...

    springboot 解决InputStream只能读取一次的问题

    在这个例子中,我们创建了一个名为`RepeatableHttpServletRequest`的类,它继承自`HttpServletRequestWrapper`。在构造函数中,我们读取原始的`HttpServletRequest`的`InputStream`,并将数据缓存到`...

Global site tag (gtag.js) - Google Analytics