day22(过滤器Filter)

news/2024/7/8 1:48:02

过滤器

  生命周期:初始化 -----过滤-------销毁

  作用:过滤url ,特定字符

  创建方式:实现一个接口继承Filter 

package com.baidu.filter;

import java.io.IOException;
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 Demo01 implements Filter {

	public void destroy() {
		System.out.println("过滤销毁");
	}


	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("请求过滤");
		MyHttpServletRequest msr=new MyHttpServletRequest((HttpServletRequest)request);
		chain.doFilter(msr, response);
		System.out.println("响应过滤");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("过滤器初始化");
	}

}

  

    配置过滤器(web.xml)

        和配置servlet相似。

 

<filter>
    <filter-name>Demo01</filter-name>
    <filter-class>com.baidu.filter.Demo01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Demo01</filter-name>
    <url-pattern>/*</url-pattern>//可以设置经过过滤器的url  /*表示项目下的所有路径都得经过过滤器
  </filter-mapping>

 

      过滤器在web中的位置

    浏览器        < ------------ >         过滤器              < ------------   >              服务器

 

  注意事项

    1.配置文件中会配置Filter过滤器的位置只要符合其位置就会经过过滤器    

    2.请求完成以后响应动作也会经过过滤器 

  使用过滤器来修改编码格式,这样就不需要用每个servlet中去修改编码格式了

    

 

(使用的装饰者设计模式来实现)
package com.baidu.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyHttpServletRequest extends HttpServletRequestWrapper {
	private HttpServletRequest request;
	public MyHttpServletRequest(HttpServletRequest request) {
		super(request);
		this.request=request;
	}
	@Override
	public String getParameter(String name) {
		//判断提交方式(get/post)
		String method = request.getMethod();
		if ("Get".equalsIgnoreCase(method)) {
			String value = super.getParameter(name);
				try {
					value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return value;
		}
		if ("post".equalsIgnoreCase(method)) {
			try {
				System.out.println(request.getCharacterEncoding());
				request.setCharacterEncoding("UTF-8");
				//value = super.getParameter(name);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return super.getParameter(name);
	}

}

 

  使用动态代理来实现实现类的增强

 

public class GenericEncodingFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		final HttpServletRequest req = (HttpServletRequest) request;
		// 增强req:(使用匿名内部类)
		HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
				req.getClass().getInterfaces(), new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// 判断执行的方法是否是getParameter:
						if("getParameter".equals(method.getName())){
							// 调用的是getParameter:需要增强这个方法.
							// 判断请求方式是GET还是POST:
							String type = req.getMethod();
							if("get".equalsIgnoreCase(type)){
								String value = (String) method.invoke(req, args);
								value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
								return value;
							}else if("post".equalsIgnoreCase(type)){
								req.setCharacterEncoding("UTF-8");
							}
						}
						return method.invoke(req, args);
					}
				});
		
		chain.doFilter(myReq, response);
	}

	@Override
	public void destroy() {

	}

}

  

转载于:https://www.cnblogs.com/fjkgrbk/p/Filter.html


http://www.niftyadmin.cn/n/1999973.html

相关文章

一个女强人的经历

一个女强人的经历98年到现在&#xff0c;我一直迈着浮躁的步伐走着我的技术之路。有时候想到底是我从未走近技术&#xff0c;还是技术抛弃了我&#xff0c;还是说大环境让我无法深入某个技术领域&#xff1f;怎么给自己定位? 我显得如此迷惘。98年我还在上大一&#xff0c;从小…

4g镜像安装 centos7_使用KVM制作OpenStack QCOW2格式镜像

1. Centos7安装KVM1.1. 安装相关软件包yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer -yqemu-kvm: KVM模块libvirt: 虚拟管理模块virt-manager: 图形界面管理虚拟机virt-install: 虚拟机命令行安装…

获得本地IP

//一些定义&#xff1a;// hostent declare/*struct hostent { char FAR * h_name; // official name of host char FAR * FAR * h_aliases; // alias list short h_addrtype; // host address type short h…

SSH之struts.xml

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <!-- 使用…

django 模板两次for循环_在Django模板中安全地包含JavaScript数据

Django模板通常用于将数据传递给JavaScript代码。不幸的是&#xff0c;如果实现的不正确的话&#xff0c;就可能会增加HTML注入的可能性&#xff0c;从而导致XSS(跨站点脚本)攻击。这是我在Django项目中遇到的最常见的安全问题之一。事实上&#xff0c;我几乎在每一个大型Djang…

C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

前言系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自…

url中能出现的字符_基础篇:一文读懂JAVA.IO、字符编码、URL和Spring.Resource

1 http://JAVA.IO字节流LineNumberInputStream和StringBufferInputStream官方建议不再使用&#xff0c;推荐使用LineNumberReader和StringReader代替ByteArrayInputStream和ByteArrayOutputStream 字节数组处理流&#xff0c;在内存中建立一个缓冲区作为流使用&#xff0c;从缓…

tcp服务端与客户端

//客户端&#xff1a; #include <iostream>#include <stdio.h>#include <windows.h> using namespace std; #pragma comment(lib, "WS2_32.lib") int main(){ WSADATA wsaData; WORD sockVersion MAKEWORD(2, 2); SOCKET sock 0; if (WSASta…