首先声明,看懂这篇文章的前提是你对java web的乱码问题有一定的了解.
一. 引导部分
一般在网站出现乱码的时候,我们会采用response.setContentType("text/html;charset=utf-8"); 或者 response.setHeader("content-type","text/html;charset=utf-8"); 以及String value = new String(value.getBytes("iso8859-1"), "utf-8"); 还有<%@ page language="java" pageEncoding="utf-8"%>这些代码来解决.
但是有一个问题:每写一个jsp或者每写一个servlet(jsp和servlet本质上是同一个东西),都需要重复的写这些相同的代码.现在要想一个办法将这些代码只写一遍就可以解决所有页面的乱码问题?思前想后,当然是filter了.写一个过滤器拦截所有的请求,在请求之前将这些乱码问题解决掉.(可能看到这儿有点迷糊,不要慌,请继续往下看)
注意:如果上述这些代码没有看懂,则建议弄懂原理之后再翻过来看这篇文章,这样理解起来比较轻松.
二. 实战部分
创建一个filter,在web.xml里进行配置,(如无特殊情况,最好将其配置在其他filter前面).但本实例中并没有采取这种方式,而采取了注解的方式定义filter.
具体代码如下:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
@WebFilter(urlPatterns = "/*")//利用注解定义filter,在web.xml中配置filter也可取 二者取其一即可
public class EncodeFilter implements Filter {//实现filter借口,就要实现其对应的方法
public EncodeFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("进入encodefilter");
HttpServletRequest req = (HttpServletRequest) request;//因为所提供的参数类型不一致,需要强转一下才能调用HttpServletRequest的方法
HttpServletResponse resp = (HttpServletResponse) response;//与上述一样
if (req.getMethod().equalsIgnoreCase("post")) {//如果拦截到的请求为post请求
request.setCharacterEncoding("utf-8");
} else {//如果拦截到的请求为get请求
req = new myreq(req);//将req对象重新包装一下,也就是将其中req包含的信息中的乱码问题解决(本质就是将编码格式改变)
}
resp.setContentType("text/html;charset=utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
//此处要重点说明一下,为什么不是实现HttpServletRequest接口,
//因为如果实现接口的话,就要实现接口中定义的全部方法,由于该接口中的方法过多,实现起来代码量比较多,所以不建议采用这种方法
//而java中提供了其实现类HttpServletRequestWrapper,只要继承该类,并修改其对应的方法即可
class myreq extends HttpServletRequestWrapper {
private HttpServletRequest request;
public myreq(HttpServletRequest request) {//带参构造函数
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
try {
String value = request.getParameter(name);
if (value != null) {
value = new String(value.getBytes("iso8859-1"), "utf-8");//进行编码转化
}
return value;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
//这个方法的改写就留给读者考虑吧!!!大家可以在评论区里发表自己的看法和建议.
public String[] getParameterValues(String name) {
}
}
如果您有什么问题或者建议,可以在评论中提出您宝贵的建议!!!
emmmmmm.........