Java中Filter与Inteceptor的区别

1.Filter与Inteceptor

建议参考文档:https://www.cnblogs.com/austinspark-jessylu/p/7453302.html

Filter 主要是实现拦截客户端到达servlet到页面请求,并且能够修改请求(HttpServletRequest)的头和数据。只用于对request,response进行修改,一次请求通过两次Filter,请求时一次,在拦截器之间进行处理,执行doFilter()之前的代码,返回时一次,执行doFilter()中的代码.

如果要自己实现一个自定义的Filter必须实现javax.servlet.Filter接口,接口中有三个方法:inti(),doFilter(),destory().

Filter结合Inteceptor的调用过程;

Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter

Interceptor

可以通过实现HandlerInterceptor接口以及继承HandlerInterceptorAdapter来实现自定义拦截器

自定义拦截器中主要有三个方法:

prehandle(): 在业务处理器处理请求之前被调用

postHandle():在业务处理器处理请求完成之后,生成视图之前执行

afterCompletion():在DispatcherServlet完全处理完请求之后被调用,可用于清理资源

public class SecurityInterceptor implements HandlerInterceptor {

	@Autowired
	private UserService userService;

	private static final String LOGIN_URL = "../login.html";
	
	private static final String TIP_URL="../denied.html";

	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse res,
			Object handler) throws Exception {
		HttpSession session = req.getSession(true);
		// 从session 里面获取用户名的信息
		Object obj = session.getAttribute("user_account");

		// 判断如果没有取到用户信息,就跳转到登陆页面,提示用户进行登陆
		if (obj == null || "".equals(obj.toString())) {
			res.sendRedirect(LOGIN_URL);
			return false;
		}
		
		User user=userService.getUserByUserAccount(obj.toString());
		if(user.getRole()!=3){
			res.sendRedirect(TIP_URL);
			return false;
		}

		return true;
	}

	@Override
	public void postHandle(HttpServletRequest req, HttpServletResponse res,
			Object arg2, ModelAndView arg3) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest req,
			HttpServletResponse res, Object arg2, Exception arg3)
			throws Exception {
	}

}

非springboot项目下拦截器的配置

 

总结:

对于上述过滤器和拦截器的测试,可以得到如下结论:
(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;

(4)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值