web中文编码

Eclipse设置的编码环境是:utf-8

思想:中文,编码器和解码器必须相匹配,否则需要转码

1、servlet接受Edge的中文请求参数,无需转码,如果是iso8859-1编码的中文,需要转码为utf-8

String username = new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8");

2、接受Edge的post请求,需要设置接受的字符集,然后开始获取参数值

request.setCharacterEncoding("utf-8");

3、如果需要servlet写回中文到页面,需要设置编码,get和post相同

response.setContentType("text/html;charset=utf-8");

4、始终判断请求方式设置编码方式,servlet处理编码

package user;

import java.io.IOException;

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

import service.UserService;

/**
 * 编码测试
 */
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// String username = new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8");
        if(request.getMethod().equalsIgnoreCase("post")) {
            request.setCharacterEncoding("utf-8");
        }
        
        System.out.println(request.getParameter("username"));
        
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().append("Served at: ").append(request.getContextPath()).append(request.getParameter("username"));
        
    }

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

5、使用filter统一编码

package filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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.HttpServletResponse;

/**
 * Servlet Filter implementation class EncodingFilter2
 */
public class EncodingFilter implements Filter {

    public void init(FilterConfig fConfig) throws ServletException {
    }
    
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        // 强转类型
        final HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)res;
        
        // 动态代理
        // Proxy.newProxyInstance(HttpServletRequest.class, request.getClass().getInterfaces(), new InvocationHandler() {
        HttpServletRequest requspProxy = (HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if("getParameter".equals(method.getName())) {
                    String m = request.getMethod();
                    
                    if("get".equalsIgnoreCase(m)) {
                        String s = (String) method.invoke(request, args);
                        //return new String(s.getBytes("iso8859-1"), "utf-8");  // 用于浏览器默认使用iso8859-1编码,edge中不需要此设置
                        return s;
                    }else if("post".equalsIgnoreCase(m)) {
                        request.setCharacterEncoding("utf-8");
                        return (String) method.invoke(request, args);
                    }
                }
                response.setContentType("text/html;charset=utf-8");
                return method.invoke(request, args);
            }
        });
        
        chain.doFilter(requspProxy, response);
    }


    public void destroy() {
    }

}

web.xml配置

 <filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/login</url-pattern>
  </filter-mapping>
posted @ 2020-01-02 14:08  马帅领  阅读(527)  评论(0编辑  收藏  举报