javaWeb_全站编码

目的 : 实现javaweb项目的全站编码问题

需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决

设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparameter()方法进行编码的转换; 对于POST请求直接在FIilter进行过转换即可.

实际代码 : 

  1. Filter文件

package com.theangryz.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/html;charset=utf-8");
        HttpServletRequest req = (HttpServletRequest) request;
        req.setCharacterEncoding("utf-8");
        EncodingRequest encodingRequest= new EncodingRequest(req);
        if (req.getMethod().equals("GET")){ //get请求
            chain.doFilter(encodingRequest, response);
        }else if (req.getMethod().equals("POST")){  //post请求
            chain.doFilter(req, response);
        }
    }

    @Override
    public void destroy() {

    }
}

  2. EncodingRequest文件(对于GET请求的处理)

package com.theangryz.filter;



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

public class EncodingRequest extends HttpServletRequestWrapper {    //采用装饰者模式
    private HttpServletRequest request;
    public EncodingRequest(HttpServletRequest httpServletRequest){
        super(httpServletRequest);
        this.request = httpServletRequest;
    }

    @Override
    public String getParameter(String name) {
        try {
            String str = new String(request.getParameter(name).getBytes("iso-8859-1"), "utf-8");
            return str;
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }
}

 

实际编写中遇到的问题 : 

  1. 发现自己的GET请求已经通过UTF-8的方式进行编码了.

    解决 : Tomcat默认配置(配置文件 : /安装目录/conf/server.xml)使用ISO-8859-1进行编码, 自己不知道何时修改过配置文件修改成了UTF-8配置了. 所以没有转换的必要了.

  2. 重写getparameter()方法的时候, 参数理解错误了. getParameter(String name)入参name指的是请求中的参数名称, 需要使用 String str = request.getRequest(name);, 而不是直接name.getBytes("");

  解决 : String str = request.getParameter(name); return new String(str.getBytes("iso--8859-1"), "utf-8");

posted @ 2019-12-01 11:08  gogoog  阅读(276)  评论(0编辑  收藏  举报