码迷,mamicode.com
首页 > 其他好文 > 详细

17用filter实现全栈乱码过滤 和30天自动登录

时间:2019-08-19 23:03:02      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:style   继承   哪些   ext   for   自动登录   res   接口   etc   

       1. 全站乱码过滤

              在整个EasyMall项目中,有多处都需要进行乱码处理,这些内容可以提取到一个模块中,这个模块可以是一个过滤器。

              过滤器需要将请求与响应中的乱码进行处理。

              a. 处理方式:

                     i. 响应乱码

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

                     ii. 请求乱码

                            分get与post两种情况。

                            如果为post请求,则只需:request.setCharacterEncoding("utf-8");

                            如果为get请求,则需要将每一个参数的乱码进行处理。

                             并且如果将参数取出之后再进行处理,那么下一个request 的参数还需要再次处理,也不能确定需要处理的参数都有哪些,所以应该将原有request对象身上的参数处理完成,再设置回原有request身上才行。

                     iii. 解决方案:

                            1) 继承:可以重写方法但是不是修改的原有类中的方法,不符合需求。

                            2) 装饰者模式:是修改原有类中的方法,满足需求。

                            3) 动态代理:自行了解。

技术图片

装饰类就是我们写的,通过装饰类的构造函数来接收装饰类的对象

              b. 代码实现:

创建EncodingFilter.java

package com.easymall.filter;
                
                import java.io.IOException;
                import java.util.HashMap;
                import java.util.Map;
                
                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 {
                        String encode = null;
                        boolean use_encode ;
                        public void init(FilterConfig filterConfig) throws ServletException {
                                //在当前过滤器配置信息对象的身上,
                                //可以引入代表web应用的对象servletContext,这样即可获取全局配置信息
                                encode = filterConfig.getServletContext().getInitParameter("encode");
                                //读取字符集是否使用的开发
                                use_encode = Boolean.parseBoolean(filterConfig.getServletContext().getInitParameter("use_encode"));
                
                        }
                        
                        public void doFilter(ServletRequest request, ServletResponse response,
                                FilterChain chain) throws IOException, ServletException {
                                //1.请求乱码处理post   
                //        request.setCharacterEncoding("utf-8");
                        //get请求乱码处理
                        HttpServletRequest req = (HttpServletRequest) (use_encode?//use_encode是是否使用编码的开关,如果为true就说明tomcat配置的编码格式和我要求的不一样是iso8859-1我要用全站乱//码解析,如果不为true就代表tomcat的编码格式配置好了 utf-8不需要再做修改所以是正常的request 而不是装饰者的request
 new MyHttpServletRequest((HttpServletRequest) request,encode):request); //红色返回的是HTTPservletrequestWRAP的对象 可以用
HTTPservletrequest接住
//2.响应乱码 response.setContentType("text/html;charset="+encode); //放行  chain.doFilter(req, response); } public void destroy() { } }

添加web.xml配置

<!-- 全站乱码过滤器 -->
  <filter>
      <filter-name>EncodingFilter</filter-name>
      <filter-class>com.easymall.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

创建MyHttpServletRequest类

                package com.easymall.filter;
                
                import java.util.HashMap;
                import java.util.Map;
                
                import javax.servlet.http.HttpServletRequest;
                import javax.servlet.http.HttpServletRequestWrapper;
                
                public class MyHttpServletRequest extends HttpServletRequestWrapper{  //本来实现的是HttpServletRequest接口,但是其要实现的方法太多了,我们只要实现获取参数的方法,更改参数中的乱码就行,所以我们采用HttpServletResquestWapper 他是HttpServletRequestWrapper 子实现抽象接口
                
                        HttpServletRequest request = null;
                        String encode = null;
                        public MyHttpServletRequest(HttpServletRequest request,String encode) {
                                super(request);
                                this.request = request;
                                this.encode = encode;
                                
                        }
                        
                        @Override
                        public Map<String,String[]> getParameterMap() {
                                //将原有map中的参数取出,处理乱码之后放入新的map中,并且返回新map
                                Map<String,String[]> map = request.getParameterMap();
                                //取出原map中的参数名和参数值,将处理后的参数值放入新map
                                Map<String,String[]> rmap = new HashMap();
                                //遍历原map,处理参数值乱码
                                try {
                                        for(Map.Entry<String, String[]> entry:map.entrySet()){
                                                String key = entry.getKey();//获取键名备用
                                                String[] value = entry.getValue();//需要处理乱码
                                                //遍历数组,将每一个值做乱码处理,再将乱码处理后的数据放入一个新的数组中。
                                                String[] rvalue = new String[value.length];//创建一个与原数组长度相同的数组,来存储处理后的数据
                                                for(int i=0;i<value.length;i++){//遍历数组中每一个元素
                                                        //处理数组中每一个元素的乱码,并放入新数组中
                                                        rvalue[i] = new String(value[i].getBytes("iso8859-1"),encode);
                                                }
                                                //将新数组添加到新map中
                                                rmap.put(key, rvalue);
                                        }
                                        return rmap;
                                } catch (Exception e) {
                                        throw new RuntimeException(e);
                                }
                        }
                        @Override
                        public String[] getParameterValues(String name) {
                                //获取乱码处理后的getParameterMap方法中的值,即当前方法所需结果
                                Map<String,String[]> map = getParameterMap();
                                return map.get(name);
                        }
                        @Override
                        public String getParameter(String name) {
                                //上方方法的返回值是一个数组,取出数组中的第一个元素即可
                                String[] values = getParameterValues(name);
                                return  values!=null?values[0] : null; 
                        }
                        
                }
            iv. 添加全局配置信息
                <!-- 字符集选择 -->
                  <context-param>
                      <param-name>encode</param-name>
                      <param-value>utf-8</param-value>
                  </context-param>
                  <!-- 字符集使用开关 -->
                  <context-param>
                      <param-name>use_encode</param-name>
                      <param-value>true</param-value>
                  </context-param>

 

17用filter实现全栈乱码过滤 和30天自动登录

标签:style   继承   哪些   ext   for   自动登录   res   接口   etc   

原文地址:https://www.cnblogs.com/xuwangqi/p/11380078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!