java利用过滤器实现编码的转换

在页面建个表单

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

建个servlet

web.xml

  <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.xml中配置filter

   <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上下文对象.

时间: 11-25

java利用过滤器实现编码的转换的相关文章

java字符串的各种编码转换

import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class ChangeCharset { /** 7位ASCII字符,也叫作ISO646-US.Unicode字符集的基本拉丁块 */ public static final String US_ASCII = "US-ASCII"; /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ public static fina

【Filter】利用过滤器Filter解决post传递的编码问题与利用EL表达式简化参数传递

post传递的编码问题,解决的方式有两种,一种是修改Tomcat的配置文件,这种方式是我反对的,因为你并不能保证自己的工程在任意一个Tomcat都能跑,当然如果以后出现什么情况,处理修改Tomcat配置文件,没有别的的话,那么才修改也不迟,另一种是在页面取值之前使用: request.setCharacterEncoding("utf-8"); 本来这样没什么的,不就一行代码吗?但是在现在JSP编程不停强调页面绝对不能出现后端代码的趋势下,不能使用<[Jsp]使用Post与Get

【转载】java字符串的各种编码转换

java字符串的各种编码转换 来自:http://www.blogjava.net/rabbit/archive/2008/03/27/189009.html import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */public class ChangeCharset { /** 7位ASCII字符,也叫作ISO646-US.Unicode字符集的基本拉丁块 */ public static final String US_AS

利用JAXB实现java实体类和xml互相转换

1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同理).map.Teacher.Date 类型的属性 package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccess

java利用Base64编码和解码图片文件

1.编码与解码代码如下所示: import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.image

利用 Project Lombok 自定义 AST 转换

转自 http://www.ibm.com/developerworks/cn/java/j-lombok/ 利用 Project Lombok 自定义 AST 转换 何时以及如何为自定义代码生成扩展 Lombok Alex Ruiz 在本文中介绍了 Project Lombok,探讨了它的一些独特的编程特色,包括注释驱动代码生成,以及简洁.紧凑.可读的代码.然后,他会提示大家关注 Lombok 更有价值的用途:利用自定义 AST(Abstract Syntax Tree,抽象语法树)转换来对其

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailSenderImpl发送邮件.首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件及以velocity为模板发送邮件. 邮件发送分为为三步:创建邮件发送器.编写邮件.发送邮件. Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件.带附件邮件.html格式

JavaEE之--------利用过滤器实现用户自动登录,安全登录,取消自动登录黑用户禁止登录

在我们生活中,对于账户的自动登录已经很常见了,所以利用过滤器实现这个功能 主要介绍用户的自动登录和取消自动登录,以及实现一天自动登录或者n天实现自动登录,当用户ip被加入到黑名单之后,直接利用过滤器返回一个警告页面. 过滤器的功能很是强大,我们只需要在写好的前台后servlet之后进行添加就可以实现这个功能 Ps:这个仅仅只是一个演示而已,里面的访问数据库的部分,自己随意模拟了下,主要是突出实现自动登录的功能. 前台代码: 前台代码是成功与否都在这个页面显示.用到的技术:jstl标签的应用,se

Java web中常见编码乱码问题(二)

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s