本文主要是介绍JavaWeb应用设置全站乱码过滤器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Tomcat服务器接收请求时采用的是iso8859-1格式对请求中的参数进行编码,而该编码格式无法识别中文,因此在解码时会产生乱码问题。我们可以为整个web应用设置一个过滤器,让所有的访问请求首先经过过滤器,进行手动编解码,从而避免乱码问题的出现。下面是一段过滤器代码:package com.sun.day18;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;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 javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/*** 处理整个web应用全站乱码* 1)处理请求参数乱码* 2)处理响应正文乱码* @author RoySun**/
public class MixCodeFilter implements Filter{@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;//针对post提交方式,这一句即可处理接收请求中的乱码request.setCharacterEncoding("utf-8");/**过滤器中处理响应正文乱码,*所有拦截到的资源的乱码问题都可以解决 */response.setContentType("text/html;charset=utf-8");/** 采用装饰者模式,将request对象进行包装,* 在装饰类中重写getParameter等获取参数的方法*/MyHttpServletRequest myRequest = new MyHttpServletRequest(req);chain.doFilter(myRequest, response);}@Overridepublic void init(FilterConfig onfig) throws ServletException {}}
//装饰类,对HttpServletRequest类进行装饰,重写获取请求参数的方法
class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request;//构造方法public MyHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {return this.getParameterValues(name)==null? null:this.getParameterValues(name)[0];}@Overridepublic String[] getParameterValues(String name) {return this.getParameterMap().get(name);}private boolean isEncode=true;@Overridepublic Map<String, String[]> getParameterMap() {if("GET".equalsIgnoreCase(request.getMethod())){//针对get提交方式进行手动编解码Map<String, String[]> map = request.getParameterMap();if(isEncode){for (Entry<String, String[]> entry : map.entrySet()) {String[] params = entry.getValue();for(int i=0;i<params.length;i++){try {params[i]=new String(params[i].getBytes("iso8859-1"), "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}isEncode = false;}return map; }else{//其余6种提交方式return request.getParameterMap();}}}
这个过滤器中重点针对了我们平时常用的get和post请求模式。post模式的请求参数在响应实体中,采用request.setCharacterEncoding("utf-8")即可处理请求乱码。get请求模式因为它的请求参数是附在请求行中的,因此在获取请求参数的时候,需要先采用iso8859-1格式进行编码,再进行手动采用utf-8格式解码,这样一来我们在过滤器之后的访问中,数据格式都统一为utf-8编码格式。
这里采用了装饰者模式,对HttpServletRequest进行装饰,重写其中获取请求参数的三种方法,在其中进行手动编解码,统一为utf-8格式编码,经过过滤器之后的请求对象request就是被装饰过得myRequest对象,再调用获取请求参数的方法时,就不会出现乱码问题。
在写好过滤器之后,我们需要在web应用的配置文件web.xml文件中配置过滤器,配置如下:
<filter><filter-name>MixCodeFilter</filter-name><filter-class>com.sun.day18.MixCodeFilter</filter-class>
</filter>
<filter-mapping><filter-name>MixCodeFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
filter-class表示完整类名,url-pattern表示拦截的访问路径,/*表示拦截过滤所有访问。
这篇关于JavaWeb应用设置全站乱码过滤器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!