二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别
1、Servlet:运行在服务器上可以动态生成web页面。servlet的声明周期从被装入到web服务器内存,到服务器关闭结束。一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作init(),调用doPost()和doGet()方法。然后调用destroy()方法进行销毁实例。
2、Filter:必须实现Filter的接口(javax.servlet.Filter),有点类似servlet的过程,也是启动服务器的时候加载过滤器的实例,然后调用初始化方法init()来初始化实例,每一次请求都之调用doFilter()方法进行处理,停止服务器后,会调用destroy()方法进行销毁实例。过滤器用于过滤掉非法的URL请求。过滤器是基于函数回调,依赖于Servlet容器。
/*过滤器*/
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class TestFilter extends HttpServlet implements Filter{
//销毁方法
public void destroy(){
System.out.println("销毁方法执行---");
} public void doFilter(ServletRequest args1,ServletResponse args2,FilterChain filterChain) throws IOException,ServletException{
HttpServletRequest request=(HttpServletRequest)args1;
HttpServletResponse response=(HttpServletResponse)args2;
requestCharacterEncoding("UTF-8");
//继续转发请求,必须有
filterChain.doFilter(request,response);
} public void init(FilterConfig args1) throws ServletException{
System.out.println("初始化方法执行---");
}
}
在web.xml中的配置:
<filter>
<filter-name>filter</filter-name>
<filter-class>com.demo.filter.TestFilter</fiter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、Listener:主要是用来进行监听web服务器中的一个执行动作,也是随着web服务器的启动而启动,只初始化一次,随着web服务器的停止而销毁。
/*监听器*/
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class TestListener implements ServletContextListener{
public void destroy(ServletContextEvent args){
//在web应用销毁之前调用
System.out.println("销毁方法执行---")
} public void init(ServletContextEvent args){
//初始化一个对象,然后赋值
Product product=new Product();
proudct.setName("Apple");
product.setId(2);
product.setPrice(2.5); //将对象存到容器中
ServletContext sc=args.getServletContext();
sc.setAttribute("product",product); //在web应用的其他地方都可以通过这条代码得到product对象
Product product=(Product)request.getSession().getServletContext().getAttribute("product");
System.out.println("初始化---");
}
}
在web.xml中的配置:
<listener>
<listener-class>com.demo.listener.TestListener</listener-class>
</listener>
servlet,filter,listener都是配置到web.xml上的,Structs2中的拦截器interceptor配置到structs.xml上,spring的拦截器配置在spring-servlet.xml中。
4、Interceptor:拦截器类似Filter,也是拦截用户的请求,不是随着web应用的启动而启动,只有调用相应的方法才会调用。比如进行权限验证,或者来判断用户是否登录,日志记录,或者限制时间点访问。应用在面向切面编程AOP。拦截器是基于java反射机制,不依赖Servlet容器
拦截器只能对structs中的Action,spring中的service起作用。过滤器几乎对所有请求都起作用。
在action的生命周期中,拦截器可以被调用多次,而过滤器只能在容器初始化的时候被调用一次。
structs2中拦截器的实现:
1、继承AbstractInterceptor类
2、实现Interceptor接口
3、继承MethodFilterInterceptor类
在structs.xml中配置拦截器。
<!-- 配置拦截器 -->
<interceptors>
<!-- 配置自定义拦截器 -->
<interceptor name="TestInterceptor" class="com.demo.interceptor.TestInterceptor"></interceptor>
<!-- 配置拦截器栈 -->
<interceptor-stack name="TestStack">
<interceptor-ref name="defaultStack"/><!-- 加载默认拦截器 -->
<!-- 加载自定义拦截器 -->
<interceptor-ref name="TestInterceptor">
<!-- 配置要拦截的方法;user,client为方法名 -->
<param name="includeMethods">user,client</param>
<!-- 配置不需要拦截的方法;login为方法名 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
public class TestInterceptor extends AbstractInterceptor {
//这个是需要用到的自定义的方法。
private GroupPowerService groupPowerService;
public String intercept(ActionInvocation invocation) throws Exception {
Map map= invocation.getInvocationContext().getSession();
if (map.get("user")==null){
return "noLogin";
}
else{
//得到用户的权限id 和 访问的类名
int id = ((User)map.get("user")).getGroupId();
//拦截的action的名字
String action = invocation.getInvocationContext().getName();
//通过用户id 和拦截的action名判断用户是否有这个权限
if(this.groupPowerService.hasPower(id,action))
//继续执行 不拦截
return invocation.invoke();
return "noPower";
}
}
public GroupPowerService getGroupPowerService() {
return groupPowerService;
}
二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别的更多相关文章
- java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...
- web 过滤器 Filter、 Spring 拦截器 interceptor
1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> ...
- Java过滤器(Filter)与SpringMVC拦截器(Interceptor)之间的关系与区别
过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对action请求起作用,而过滤 ...
- springBoot(6)---过滤器,监听器,拦截器
过滤器,监听器,拦截器 一.理解它们 看里十几篇博客,总算有点小明白,总的来讲,两张图可以让我看明白点. 通过两幅图我们可以理解拦截器和过滤器的特点 1.过滤器 过滤器是在请求进入tomcat容器后, ...
- 小白的springboot之路(十三)、过滤器、监听器、拦截器
0.前言 过滤器.监听器.拦截器在实际开发中经常需要用到,下面我们来介绍一下spring boot中如何使用: 一.------ 过滤器 ----- 1.作用: 过滤器是客户端与服务器资源文件之间的一 ...
- 十五、struts2中的拦截器(框架功能核心)
十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...
- SpringBoot | 第七章:过滤器、监听器、拦截器
前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏高词汇.访问权限控制(URL级别)等业务需求.这些对于业务来说一般上是无关的,业务方是无需关系的,业务只需 ...
- JavaEE基础(05):过滤器、监听器、拦截器,应用详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Listener监听器 1.概念简介 JavaWeb三大组件:Servlet,Listener,Filter.监听器就是指在应用程序中监听 ...
- Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...
随机推荐
- 2、Python程序控制结构(0530)
条件测试: 1.if 条件测试表达式 python的比较操作 1.所有的python对象都支持比较操作 可用于测试相等性.相对大小等: 如果是符合对象,python会检查其所有部分,包括自动遍历各级嵌 ...
- C#题目及答案(2)
1. NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术. C#是一种编程语言,可以基于.NET平台的应用. 2.一列数的规则如下: 1.1.2.3. ...
- ZTree 获取选中的项
var zTreeOjb = $.fn.zTree.getZTreeObj("zTreeId"); //ztree的Id zTreeId 获取复选框/单选框选中的节点:var ch ...
- 获得WebBrowser中的图片数据
/// <summary> /// 获取WebBrowser指定的图片 /// </summary> /// <param name="webBrowser&q ...
- git 命令 clone分支的代码
一个项目通常含有很多分支, master分支一般是经过测试,验证没有问题后,代码才会提交到master分支 develop分支,是测试经常拉下来进行测试的分支 直接复制develop分支的git 命令 ...
- @@identity与SCOPE_IDENTITY的区别
@@identity与SCOPE_IDENTITY的区别 共同点: SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值. 不同处:SCOPE_ID ...
- 部署NTP服务器进行时间同步
NTP服务端:linl_S IP:10.0.0.15 NTP客户端:lin_C IP:10.0.0.16 NTP服务概述 1.原理 NTP(Network TimeProtocol,网络时 ...
- typeScript入门基础 (2): 数据 类型, 函数定义
1. number , boolean, string, null, undefind 枚举, any, array数组, 元祖, 2...枚举,需要的注意点, 下一个图,就是为什么yello ...
- JAVA基础知识总结:十八
一.进程和线程 1.进程 是一个程序的运行状态和资源占用的描述 进程的特点: a.独立性:不同的进程之间是独立的,相互之间资源不共享 b.动态性:进程在系统中不是静止不动的,而是一直活动的 c.并发性 ...
- Django - Python3 配置 MySQL
在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装 具体安装使用方法,可参考 Python3 - MySQL适配器 PyMySQL Django 如何链接 MySQL 数据库, 需要在 ...