在学习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使用的列子,工作需要,所以传上来的。
在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...
然而,如果我们需要在上传过程中做一些额外的操作,如验证文件类型、大小限制等,可以创建一个继承自`HttpServletRequestWrapper`的子类,并覆盖相关的方法。 以下是一个简单的例子,展示如何创建一个`...
`HttpServletRequestWrapper`是Java Servlet API中的一个类,它允许我们对`HttpServletRequest`对象进行包装,以便在请求处理过程中添加自定义的行为或者修改默认的行为。这个类位于`javax.servlet.http`包下,是`...
`HttpServletRequestWrapper` 是Servlet API中的一个抽象类,它是`HttpServletRequest` 的包装类,可以用来扩展或修改原始请求对象的功能。 标题“使用HttpServletRequestWrapper在filter修改request参数”揭示了...
Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时,中文乱码问题总是会出现。这是因为在编码和解码过程中存在不一致的问题。幸运的是,这个问题可以通过简单的...
Java、JSP 和 Servlet 乱码问题是一个常见的开发难题,主要涉及到字符编码的不一致,导致数据在不同阶段出现解码错误。以下是一些解决乱码问题的关键知识点: 1. **页面编码设置**: - 静态HTML页面可以通过`...
总结来说,这个压缩包提供了处理Web应用中乱码问题的解决方案,包括了自定义HttpServletRequestWrapper来正确解码GET参数,以及通过字符编码过滤器统一设置请求和响应的编码。这样的做法可以有效避免由于编码不一致...
在处理中文或其他多语言字符时,乱码问题时常出现,`FilterDome`就是为了解决这个问题而设计的。下面将详细介绍`FilterDome`的工作原理、如何解决乱码问题以及在SSH框架中的应用。 1. **乱码问题的来源** 在Web...
`doFilter()`方法中的两个`if`语句分别设置了请求和响应的字符编码。`init()`方法从web.xml的配置中获取编码参数。 - `web.xml`配置:定义了名为`CharactorFilter`的Filter,并指定了完整的类名`...
在Web开发过程中,处理中文乱码问题是一道绕不过的坎。特别是使用Java作为后端开发语言时,中文乱码问题更是常见。其中在Java Server Pages (JSP) 中,Post和Request中文乱码问题尤为突出,经常困扰着开发人员。然而...
首先,我们要理解乱码产生的两个主要原因: 1. **提交参数未进行URL编码**:在使用HTTP的GET方式发送请求时,如果参数值包含中文字符,应当先将其进行URL编码,以符合URL的规范。URL编码是一种将非ASCII字符转换为...
主要用于使用Request中的getParamterMap()方法生成一个实体类,其中还包括getParamterMap中字段的检查方法。详见内容!
它创建了一个名为`Request`的内部类,该类继承自`HttpServletRequestWrapper`,目的是为了封装原始的`HttpServletRequest`对象并提供额外的功能。`Request`类覆盖了`getParameter()`和`getParameterValues()`方法,...
本文将深入探讨标题中的两个关键类:`XssFilter.java` 和 `XssHttpServletRequestWrapper.java`,以及它们在过滤非法字符中的作用。 首先,`XssFilter.java` 是一个实现了Servlet过滤器接口(javax.servlet.Filter...
在这个例子中,过滤器类TomcatFormFilter通过继承HttpServletRequestWrapper来包装请求对象,并重写getParameter方法来转换参数的字符编码。 过滤器的核心部分在于: ```java public class TomcatFormFilter ...
1. **装饰模式的应用**:`HttpServletRequestWrapper`是一个装饰模式的例子。这是正确的,因为它通过继承`HttpServletRequest`接口,并在其上添加新的行为,从而扩展了请求对象的功能。 2. **扩展Servlet请求的功能...
`filter`和`manager`这两个文件名可能代表了过滤器相关的其他内容,但没有具体的文件内容,无法给出详细的解释。通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`manager`可能是一个管理多个过滤器的类,...
在这个例子中,我们创建了一个名为`RepeatableHttpServletRequest`的类,它继承自`HttpServletRequestWrapper`。在构造函数中,我们读取原始的`HttpServletRequest`的`InputStream`,并将数据缓存到`...