zoukankan      html  css  js  c++  java
  • 过滤器demo-编码统一处理

     

    package com.loaderman.demo.a_loginFilter;
    
    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中不需要再处理编码)
     *
     */
    public class EncodingFilter implements Filter {
    
        // 过滤器业务处理方法:处理的公用的业务逻辑操作
        @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                             FilterChain chain) throws IOException, ServletException {
    
            // 转型
            final HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
    
            // 一、处理公用业务
            request.setCharacterEncoding("UTF-8");                    // POST提交有效
            response.setContentType("text/html;charset=UTF-8");
    
            /*
             * 出现GET中文乱码,是因为在request.getParameter方法内部没有进行提交方式判断并处理。
             * String name = request.getParameter("userName");
             *
             * 解决:对指定接口的某一个方法进行功能扩展,可以使用代理!
             *      对request对象(目标对象),创建代理对象!
             */
            HttpServletRequest proxy =  (HttpServletRequest) Proxy.newProxyInstance(
                    request.getClass().getClassLoader(),         // 指定当前使用的累加载器
                    new Class[]{HttpServletRequest.class},         // 对目标对象实现的接口类型
                    new InvocationHandler() {                    // 事件处理器
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args)
                                throws Throwable {
                            // 定义方法返回值
                            Object returnValue = null;
                            // 获取方法名
                            String methodName = method.getName();
                            // 判断:对getParameter方法进行GET提交中文处理
                            if ("getParameter".equals(methodName)) {
    
                                // 获取请求数据值【 <input type="text" name="userName">】
                                String value = request.getParameter(args[0].toString());    // 调用目标对象的方法
    
                                // 获取提交方式
                                String methodSubmit = request.getMethod(); // 直接调用目标对象的方法
    
                                // 判断如果是GET提交,需要对数据进行处理  (POST提交已经处理过了)
                                if ("GET".equals(methodSubmit)) {
                                    if (value != null && !"".equals(value.trim())){
                                        // 处理GET中文
                                        value = new String(value.getBytes("ISO8859-1"),"UTF-8");
                                    }
                                }
                                return value;
                            }
                            else {
                                // 执行request对象的其他方法
                                returnValue = method.invoke(request, args);
                            }
    
                            return returnValue;
                        }
                    });
    
            // 二、放行 (执行下一个过滤器或者servlet)
            chain.doFilter(proxy, response);        // 传入代理对象
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void destroy() {
    
        }
    }
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
      </head>
      
      <body>
          <form name="frmLogin" action="${pageContext.request.contextPath }/login" method="post">
             用户名: <input type="text" name="userName"><br/>
            <input type="submit" value="POST提交" >
          </form>
          <hr/>
          <form name="frmLogin" action="${pageContext.request.contextPath }/login" method="get">
             用户名: <input type="text" name="userName"><br/>
            <input type="submit" value="GET提交" >
          </form>
      </body>
    </html>
       <!--1.  编码处理过滤器配置     -->
        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.loaderman.demo.a_loginFilter.EncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    package com.loaderman.demo.a_loginFilter;
    
    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 LoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 获取请求数据
            String name = request.getParameter("userName");
            System.out.println("用户:" + name);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    }
  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/loaderman/p/10019402.html
Copyright © 2011-2022 走看看