标签: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>
标签:style 继承 哪些 ext for 自动登录 res 接口 etc
原文地址:https://www.cnblogs.com/xuwangqi/p/11380078.html