你的位置:首页 > Java教程

[Java教程]java利用过滤器实现编码的转换,内容输出的替换


在页面建个表单

 <form action="login.do" method="post">    <input type="text" name="username" />    <input type="submit" value="确定" />  </form>

建个servlet

web.

 <servlet>  <servlet-name>LoginServlert</servlet-name>  <servlet-class>servlet.LoginServlert</servlet-class> </servlet> <servlet-mapping>  <servlet-name>LoginServlert</servlet-name>  <url-pattern>/login.do</url-pattern> </servlet-mapping>

package servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlert extends HttpServlet {  public LoginServlert() {    super();  }  public void destroy() {    super.destroy();   }  public void doGet(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    doPost(request, response);  }  public void doPost(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    String username = request.getParameter("username");    System.out.println("获取的username:>>>>>>"+username);  }  public void init() throws ServletException {  }}

后台情况是这样的:

乱码了.

可以通过过滤器来解决

新建一个过滤器EncodingFilter.java

package 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;public class EncodingFilter implements Filter{  private String encoding = "";  private String filterName = "";  public void init(FilterConfig filterConfig) throws ServletException {    encoding = filterConfig.getInitParameter("encoding");    filterName = filterConfig.getFilterName();    if (encoding == null || "".equals(encoding)) {      encoding = "UTF-8";    }    System.out.println("获得编码值......");  }  public void doFilter(ServletRequest request, ServletResponse res,      FilterChain chain) throws IOException, ServletException {    HttpServletRequest req=(HttpServletRequest)request;    System.out.println("请求被" + filterName + "过滤了.......");    // 分别对请求和响应进行编码设置    request.setCharacterEncoding(encoding);        res.setCharacterEncoding(encoding);    chain.doFilter(req, res);    System.out.println("响应被被" + filterName + "过滤了.......");  }  public void destroy() {    System.out.println("请求被销毁......");  }}

在web.

  <filter>   <filter-name>EncodingFilter</filter-name>   <filter-class>filter.EncodingFilter</filter-class>   <init-param>     <param-name>encoding</param-name>     <param-value>utf-8</param-value>   </init-param> </filter> <filter-mapping>   <filter-name>EncodingFilter</filter-name>   <url-pattern>*.do</url-pattern> </filter-mapping> 

跑起来:

正常了.

我们换在地址栏里输入汉字,看看是否乱码.

结果是这样的

过滤器不起作用了,怎么办.

其实request.setCharacterEncoding(encoding);只对消息体中的数据起作用,对url中的参数不起作用了.

对上面的过滤器进行优化.

编写RequestEncodingWrapper.java

package filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class RequestEncodingWrapper extends HttpServletRequestWrapper {  private String encoding = "";  public RequestEncodingWrapper(HttpServletRequest request) {    // 必须调用父类构造方法    super(request);  }  public RequestEncodingWrapper(HttpServletRequest request,String encoding){    // 必须调用父类构造方法    super(request);    this.encoding=encoding;  }    @Override  public String getParameter(String name) {    String value=getRequest().getParameter(name);    try {      //将参数值进行编码转换      if(value!=null&&!"".equals(value)){        value=new String(value.trim().getBytes("iso-8859-1"),encoding);      }    } catch (UnsupportedEncodingException e) {      e.printStackTrace();    }        return value;  }    }

优化EncodingFilter.java后

package 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;public class EncodingFilter implements Filter {  private String encoding = "";  private String filterName = "";  public void init(FilterConfig filterConfig) throws ServletException {    encoding = filterConfig.getInitParameter("encoding");    filterName = filterConfig.getFilterName();    if (encoding == null || "".equals(encoding)) {      encoding = "UTF-8";    }    System.out.println("获得编码值......");  }  public void doFilter(ServletRequest request, ServletResponse response,      FilterChain chain) throws IOException, ServletException {    HttpServletRequest req=(HttpServletRequest)request;    System.out.println("请求被" + filterName + "过滤了.......");    if("GET".equals(req.getMethod())){      req=new RequestEncodingWrapper(req,encoding);          }else {      request.setCharacterEncoding(encoding);    }    // 分别对请求和响应进行编码设置    response.setCharacterEncoding(encoding);    chain.doFilter(req, response);    System.out.println("响应被被" + filterName + "过滤了.......");  }  public void destroy() {    System.out.println("请求被销毁......");  }}

好了.

Filter接口有三个方法:

init(FilterConfig filterConfig) 初始化过滤器,filterConfig参数可以得到过滤器初始化的配置参数信息.

doFilter(ServletRequest request, ServletResponse res,FilterChain chain)

request表示客户端的请求,rewponse表示对应请求的响应,chain是过滤器对象,.在该方法中的特定过滤器完成后,

可调用doFilter请求传给过滤器中的下一个过滤器,也可以直接返回响应内容,还可以将目标重定向.

destroy():释放过滤器中使用的资源.

参数FilterConfig filterConfig有四个方法:

public String getFilterName()    得到过滤器的名字

public String getInitParameter(String name)    得到过滤器中初始化的参数值.

publi Enumeration getInitParameterNames()    得到过滤器配置中的所有初始化参数名字的枚举类型.

publi ServletContext getServlet()    得到Servlet上下文对象.

 说完了请求,我们再来说说响应.

新建一个内容替换的封装器ResponseReplaeWrapper.java

package filter;import java.io.CharArrayWriter;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class ResponseReplaeWrapper extends HttpServletResponseWrapper {  private CharArrayWriter charWriter = new CharArrayWriter();  public ResponseReplaeWrapper(HttpServletResponse response){    //必须调用父类构造方法    super(response);  }  public PrintWriter getWriter() throws IOException{    //返回字符数组Writer,缓存内容    return new PrintWriter(charWriter);  }  public CharArrayWriter getCharWriter(){    return charWriter;  }    }

过滤器:

package filter;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintWriter;import java.util.Properties;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.HttpServletResponse;public class ReplaceFilter implements Filter {  private Properties propert = new Properties();  public void init(FilterConfig filterConfig) throws ServletException {    System.out.println("ReplaceFilter init.....");    // 通过filterConfig获得初始胡文件名    String filePath = filterConfig.getInitParameter("filePath");    try {      // 导入资源文件      propert.load(ReplaceFilter.class.getClassLoader()          .getResourceAsStream(filePath));    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    }  }  public void doFilter(ServletRequest request, ServletResponse response,      FilterChain chain) throws IOException, ServletException {    HttpServletResponse res = (HttpServletResponse) response;    // 实例化响应器包装类    ResponseReplaeWrapper resp = new ResponseReplaeWrapper(res);    chain.doFilter(request, resp);    // 缓存输出字符    String outString = resp.getCharWriter().toString();    // 循环替换不合法的字符    for (Object o : propert.keySet()) {      String key = (String) o;      outString = outString.replace(key, propert.getProperty(key));    }    // 利用原先的HttpServletResponse输出字符    PrintWriter out = res.getWriter();    out.write(outString);  }  public void destroy() {    System.out.println("ReplaceFilter destroy......");  }}

在web.

<filter>   <filter-name>ReplaceFilter</filter-name>   <filter-class>filter.ReplaceFilter</filter-class>   <init-param>     <param-name>filePath</param-name>     <param-value>/replace_ZH.properties</param-value>   </init-param> </filter> <filter-mapping>   <filter-name>ReplaceFilter</filter-name>   <url-pattern>*.do</url-pattern> </filter-mapping> 

在src下新建配置文件replace_ZH.properties

建个测试的servlet

package servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ResponseServlet extends HttpServlet {  public ResponseServlet() {    super();  }  public void destroy() {    super.destroy(); // Just puts "destroy" string in log    // Put your code here  }  public void doGet(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    response.setContentType("text/html");    PrintWriter out = response.getWriter();    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");    out.println("<HTML>");    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");    out.println(" <BODY>");    out.println("思思博士<br/>色情<br/>赌博<br/>dfdffddf");    /*out.print("  This is ");    out.print(this.getClass());    out.println(", using the GET method");*/    out.println(" </BODY>");    out.println("</HTML>");    out.flush();    out.close();  }  public void doPost(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    response.setContentType("text/html");    PrintWriter out = response.getWriter();    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");    out.println("<HTML>");    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");    out.println(" <BODY>");    out.print("  This is ");    out.print(this.getClass());    out.println(", using the POST method");    out.println(" </BODY>");    out.println("</HTML>");    out.flush();    out.close();  }  public void init() throws ServletException {  }}