过滤器和拦截器的区别

来源:互联网 发布:java 字符串 == 编辑:程序博客网 时间:2024/06/02 00:04

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

关于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. 创建过滤器实例");}@Overridepublic 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、pathString name = enums.nextElement();// 获取名称对应的值String value = filterConfig.getInitParameter(name);System.out.println(name + "\t" + value);}}// 过滤器业务处理方法: 在请求到达servlet之前先进入此方法处理公用的业务逻辑操作@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("3. 执行过滤器业务处理方法");// 放行 (去到Servlet)// 如果有下一个过滤器,进入下一个过滤器,否则就执行访问servletchain.doFilter(request, response);System.out.println("5. Servlet处理完成,又回到过滤器");}@Overridepublic void destroy() {System.out.println("6. 销毁过滤器实例");}}





0 0
原创粉丝点击