过滤器和拦截器的区别

最近复习下,准备去上海!

关于interceptor与Filter区别:

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

拦截器实例:

public class UserCheckInterceptor extends AbstractInterceptor{

	/**
	 * 拦截器业务处理方法
	 */
	public String intercept(ActionInvocation invocation) throws Exception {
		// 拿到当前执行的方法名:判断,只有当前方法名不是login,就进行验证
		
		// 获取ActionContext对象
		ActionContext ac = invocation.getInvocationContext();
		
		// 获取action的代理对象
		 ActionProxy proxy = invocation.getProxy();
		 // 获取当前执行的方法名
		 String methodName = proxy.getMethod();
		 // 判断
		 if (!"login".equals(methodName)) {
			 // 先获取当前登陆的用户
			 Object obj = ac.getSession().get("userInfo");
			 if (obj == null) {
				 // 没有登陆
				 return "input";
			 } else {
				 // 当前用户有登陆
				 return invocation.invoke();
			 }
		 } else {
			 // 说明当前用户正在登陆
			 return invocation.invoke();
		 }
	}

}

过滤器实例:

public class HelloFilter implements Filter{
	
	// 创建实例
	public HelloFilter(){
		System.out.println("1. 创建过滤器实例");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("2. 执行过滤器初始化方法");
		
		// 获取过滤器在web.xml中配置的初始化参数
		String encoding = filterConfig.getInitParameter("encoding");
		System.out.println(encoding);
		
		// 获取过滤器在web.xml中配置的初始化参数 的名称
		Enumeration<String> enums =  filterConfig.getInitParameterNames();
		while (enums.hasMoreElements()){
			// 获取所有参数名称:encoding、path
			String name = enums.nextElement();
			// 获取名称对应的值
			String value = filterConfig.getInitParameter(name);
			System.out.println(name + "\t" + value);
		}
	}

	// 过滤器业务处理方法: 在请求到达servlet之前先进入此方法处理公用的业务逻辑操作
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("3. 执行过滤器业务处理方法");
		// 放行 (去到Servlet)
		// 如果有下一个过滤器,进入下一个过滤器,否则就执行访问servlet
		chain.doFilter(request, response);
		
		System.out.println("5. Servlet处理完成,又回到过滤器");
	}

	@Override
	public void destroy() {
		System.out.println("6. 销毁过滤器实例");
	}

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值