用过滤器解决乱码问题

一、创建一个抽象类httpfilter实现filter接口html

里面实现获取FilterConfig()和 getServletContext()方法;java

建一个dofilter(HttpServletRequest request,HttpServletResponse response,FilterChain chainr)抽象方法让子类去实现;web

提供一个init()初始化方法能够让子类去重写;app

package webcard.filter;ide

import java.io.IOException;post

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;this

 

public abstract class HttpFilter implements Filter {
private FilterConfig fconfig;
@Override
public void destroy() {
// TODO Auto-generated method stub编码

}
public FilterConfig getFilterConfig(){
return this.fconfig;
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {url

HttpServletRequest req=(HttpServletRequest) arg0;
HttpServletResponse res=(HttpServletResponse) arg1;
doFilter(req, res, arg2);
}
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain)throws IOException, ServletException ;
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
this.fconfig=arg0;
init();
}
public void init()throws ServletException{}
public ServletContext getServletContext(){
return fconfig.getServletContext();
}
}spa

二、提供一个myrequest继承request,自带解决get编码方式

重写getparameter()方法

package webcard.filter;

import java.io.UnsupportedEncodingException;

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

public class MyRequest extends HttpServletRequestWrapper {
private String charset;

public MyRequest(HttpServletRequest request,String charset) {

super(request);
this.charset=charset;
// TODO Auto-generated constructor stub
}
@Override
public String getParameter(String name) {
HttpServletRequest request =(HttpServletRequest) getRequest();
String value=request.getParameter(name);
String method = this.getMethod();
if (method.equalsIgnoreCase("post")) {
try {
request.setCharacterEncoding(charset);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}
}else if (method.equalsIgnoreCase("get") && value!=null) {
try {
String param=new String(super.getParameter(name).getBytes("iso8859-1"),charset);
return param;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}
}

return super.getParameter(name);

}

}

三、最后一步设置一个encoderfilter类继承httpfilter类;

package webcard.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 

public class EncodeFilter extends HttpFilter{

@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
//全站字符编码
String charset = getFilterConfig().getInitParameter("charset");
// System.out.println(charset);
if (charset==null) {
charset="utf-8";
}

response.setCharacterEncoding(charset);
response.setContentType("text/html;charset="+charset);
MyRequest myRequest = new MyRequest(request, charset);
myRequest.setCharacterEncoding(charset);
chain.doFilter(myRequest, response);
}

}

固然最后别忘了设置context.xml文件中的过滤器的做用范围:

<filter>
<filter-name>fil</filter-name>
<filter-class>webcard.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>fil</filter-name>
<url-pattern>/*</url-pattern>//默认只过滤全部的重定向请求

<dispatcher>REQUEST</dispatcher>//过滤转发 <dispatcher>FORWARD</dispatcher>//过滤网页转发 <dispatcher>INCLUDE</dispatcher>//过滤include </filter-mapping>

相关文章
相关标签/搜索