zoukankan      html  css  js  c++  java
  • 过滤器和包装类设计模式的应用

    1.中文乱码过滤器。

    get和set中文字体的设置

    public class AllCharacterEncodingFilter implements Filter {
    	private FilterConfig filterConfig;
    	
    	public void init(FilterConfig filterConfig) throws ServletException {
    		this.filterConfig = filterConfig;
    	}
    	public void doFilter(ServletRequest req, ServletResponse resp,
    			FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest)req;
    		HttpServletResponse response = (HttpServletResponse)resp;
    		//获取配置的过滤器參数encoding的值:假设没有。给定一个默认值
    		String encoding = filterConfig.getInitParameter("encoding");
    		if(encoding==null)
    			encoding = "UTF-8";
    		//设置POST请求方式的中文请求參数的编码
    		request.setCharacterEncoding(encoding);
    		//设置响应输出时的编码:字符流和字节流
    		response.setCharacterEncoding(encoding);//字节流输出时通知client的解码码表
    		response.setContentType("text/html;charset="+encoding);//字节流输出时通知client的解码码表;字符流:字符流输出时使用的码表及通知client解码用的码表
    		
    		MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
    		//放行
    		chain.doFilter(mrequest, response);
    	}
    
    	public void destroy() {
    
    	}
    }
    //使用包装类设计模式
    //HttpServletRequestWrapper内部的代码与连接池原理中那个默认适配器一样
    class MyHttpServletRequest extends HttpServletRequestWrapper{
    	public MyHttpServletRequest(HttpServletRequest request){
    		super(request);
    	}
    	//仅仅对get请求方式进行改写
    	public String getParameter(String name) {
    		String value = super.getParameter(name);
    		if(value==null)
    			return value;
    		//得到请求方式
    		String method = super.getMethod();
    		if("get".equalsIgnoreCase(method)){
    			try {
    				value = new String(value.getBytes("ISO-8859-1"),super.getCharacterEncoding());
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    		}
    		return value;
    	}	
    }

    2.脏话过滤器

    public class DirtyWordsFilter implements Filter {
    
    	public void destroy() {
    
    	}
    
    	public void doFilter(ServletRequest req, ServletResponse resp,
    			FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest)req;
    		HttpServletResponse response = (HttpServletResponse)resp;
    		DirtyWordsHttpServletRequest drequest = new DirtyWordsHttpServletRequest(request);
    		chain.doFilter(drequest, response);
    		
    	}
    
    	public void init(FilterConfig filterConfig) throws ServletException {
    
    	}
    }
    class DirtyWordsHttpServletRequest extends HttpServletRequestWrapper{
    	private String words[] = {"傻B","畜生","禽兽"};
    	public DirtyWordsHttpServletRequest(HttpServletRequest request){
    		super(request);
    	}
    	@Override
    	public String getParameter(String name) {
    		String value = super.getParameter(name);
    		if(value==null)
    			return "木有";
    		for(String dword:words){
    			if(value.contains(dword)){//推断用户输入的内容中包括脏话
    				value = value.replace(dword, "**");
    			}
    		}
    		return value;
    	}	
    }


    3.  HTML特殊标记过滤器

    //HTML标记过滤器:<   <
    public class HtmlFilter implements Filter {
    
    	public void destroy() {
    
    	}
    
    	public void doFilter(ServletRequest req, ServletResponse resp,
    			FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest)req;
    		HttpServletResponse response = (HttpServletResponse)resp;
    		HtmlHttpServletRequest hrequest = new HtmlHttpServletRequest(request);
    		chain.doFilter(hrequest, response);
    	}
    
    	public void init(FilterConfig filterConfig) throws ServletException {
    
    	}
    
    }
    class HtmlHttpServletRequest extends HttpServletRequestWrapper{
    	public HtmlHttpServletRequest(HttpServletRequest request){
    		super(request);
    	}
    
    	@Override
    	public String getParameter(String name) {
    		String value = super.getParameter(name);
    		if(value==null)
    			return value;
    		value = htmlFilter(value);//完毕标记过滤
    		return value;
    	}
    
    	private String htmlFilter(String message) {
    		if (message == null)
                return (null);
    
            char content[] = new char[message.length()];
            message.getChars(0, message.length(), content, 0);
            StringBuffer result = new StringBuffer(content.length + 50);
            for (int i = 0; i < content.length; i++) {
                switch (content[i]) {
                case '<':
                    result.append("<");
                    break;
                case '>':
                    result.append(">");
                    break;
                case '&':
                    result.append("&");
                    break;
                case '"':
                    result.append(""");
                    break;
                default:
                    result.append(content[i]);
                }
            }
            return (result.toString());
    	}
    	
    }


    web.xml中配置

    <filter>
    		<filter-name>AllCharacterEncodingFilter</filter-name>
    		<filter-class>cn.itcast.filter.AllCharacterEncodingFilter</filter-class>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>GBK</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>AllCharacterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	<filter>
    		<filter-name>DirtyWordsFilter</filter-name>
    		<filter-class>cn.itcast.filter.DirtyWordsFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>DirtyWordsFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	
    	<filter>
    		<filter-name>HtmlFilter</filter-name>
    		<filter-class>cn.itcast.filter.HtmlFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>HtmlFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	<filter>

  • 相关阅读:
    equals()与=的区别
    HashTable和HashMap的区别
    shell高级用法——磁盘管理 创建虚拟的磁盘映射到一个文件
    shell妙用之——dd命令合并多个烧录文件为一个flash镜像
    自动解包ROM 文件获取uboot,uboot-spl ,uImage, rootfs.tar.gz 并烧写SD卡
    运用层通过shell脚本直接操控gpio
    shell脚本之位运算+for循环+返回值承接+shell小数运算
    shell函数递归调用实现目录的对比拷贝
    用debootstrip制作debian环境的rootfs
    shell命令的高级使用之---选择性copy
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7196174.html
Copyright © 2011-2022 走看看