全局过滤器解决编码问题

    xiaoxiao2021-03-25  121

    为了解决每次get或者post方式提交数据的时候,编码解码方式不同导致乱码的问题,直接在过滤器中自动过滤

    新建过滤器Filter

    public class GlobalDecodeFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; //**告诉浏览器编码方式** response.setContentType("text/html;charset=utf-8"); //过滤post方式提交的数据 POST一定要大写 if (request.getMethod().equals("POST")) { request.setCharacterEncoding("utf-8");//请求数据的编码 filterChain.doFilter(request, response); }else { //过滤get方式提交的数据,先用iso-8859-1解码(包装一下) HttpServletRequest request2 = new MyRequest((HttpServletRequest) request); filterChain.doFilter(request2, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } }

    新建包装类,处理get方式的request

    //包装类 重写3个API,过滤参数的value值 class MyRequest extends HttpServletRequestWrapper { @Override public String getParameter(String name) { String param = super.getParameter(name); String key = null; try { if (param !=null) { byte[] bytes = param.getBytes("iso-8859-1"); key = new String(bytes, "utf-8"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return key; } @Override public Map<String, String[]> getParameterMap() { //Map Map<String , String[]> permeterMap = super.getParameterMap(); //取出map中的映射关系 Set<Entry<String, String[]>> entrySet = permeterMap.entrySet(); //遍历entrySet 取出键值对 for (Entry<String, String[]> entry : entrySet) { String[] values = entry.getValue(); for (String string : values) { try { //逐个遍历key的valu值,立即解码 byte[] bytes = string.getBytes("ISO-8859-1"); string = new String(bytes, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } System.out.println("map解码"); return permeterMap; } @Override public String[] getParameterValues(String name) { //数组 //拿到包含参数的key和value的map Map<String, String[]> permeterMap = getParameterMap(); //通过传进来的key拿到参数值数组(checkbox) String[] strings = permeterMap.get(name); return strings; } public MyRequest(HttpServletRequest request) { super(request); }

    web.xml中定义一个过滤器,注意filter定义一定要按提示顺序来,写在servlet前,否则报错

    <filter-mapping> <filter-name>LoginServlet</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>globladecoder</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
    转载请注明原文地址: https://ju.6miu.com/read-5738.html

    最新回复(0)