Servlet
需继承HttpServlet
servlet是一个类,是用于处理后台业务逻辑的,在web.xml下配置servlet、servlet-mapping,即可设定的请求交由设定的servlet进行处理。
init()、destroy()、service()
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.lxh.servlet.HelloServlet</servlet-class>///HelloServlet是类名
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/servletdemo</url-pattern>///当敲入本机地址后,/demo后/servletdemo会找到编译后的HelloServlet文件。
</servlet-mapping>
可以处理get、post等请求
Filter
Filte是过滤器,能够对servlet容器的请求和响应对象进行检查和修改。可以在servlet被调用前检查request对象,修改request header和request内容;在servlet被调用后检查response对象,修改response header和response内容。并且多个过滤器可以串联起来,形成管道效应,协同修改请求和响应对象。
需要实现Filte接口,方法有
- init()过滤器初始化方法
- destroy()过滤器销毁调用的方法
- doFilter()完成实际的过滤操作方法,当客户请求和访问与过滤器关联的url时,会先调用此方法
servlet容器根据filter在web.xml中定义的先后顺序,依次调用它们的doFilter()方法。
1、统一POST请求中文字符编码的过滤器
2、控制浏览器缓存页面中的静态资源的过滤器
有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。
3、使用Filter实现URL级别的权限认证
在实际开发中我们经常把一些执行敏感操作的servlet映射到一些特殊目录中,并用filter把这些特殊目录保护起来,限制只能拥有相应访问权限的用户才能访问这些目录下的资源。从而在我们系统中实现一种URL级别的权限功能。
4、实现用户自动登陆
首先,在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。
Listener
Listener监听web容器运行时内部发生的各种事件
监听对象
1)监听 Session、request、ServletContext 的创建于销毁,分别为
HttpSessionLister、ServletContextListener、ServletRequestListener
void contextInitialized(ServletContextEvent sce):创建Servletcontext时
void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时
2)监听对象属性变化,分别为:
HttpSessionAttributeLister、ServletContextAttributeListener、ServletRequestAttributeListener
void attributeAdded(ServletContextAttributeEvent event):添加属性时;
void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
void attributeRemoved(ServletContextAttributeEvent event):移除属性时;
3)与session中的绑定的对象相关的监听器(对象感知监听器)
1:HttpSessionBindingListener监听
⑴在需要监听的实体类实现HttpSessionBindingListener接口
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法
2:HttpSessionActivationListener监听
⑴在需要监听的实体类实现HttpSessionActivationListener接口
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法
应用
- 利用HttpSessionLister,统计当前在线人数。
- 自定义Session扫描器
Intercaptor
拦截器是在面向切面编程中应用的。
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类
interceptor 的执行顺序大致为:
- 请求到达 DispatcherServlet
- DispatcherServlet 发送至 Interceptor ,执行 preHandle
- 请求达到 Controller
- 请求结束后,postHandle 执行
Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:
- preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
- postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
- afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等
拦截器(Interceptor)和过滤器(Filter)的执行顺序
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。
过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。
何时使用拦截器?何时使用过滤器?
- 如果是非spring项目,那么拦截器不能用,只能使用过滤器。
- 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
- 如果是处理dispaterServlet前后,只能使用过滤器。
原文
https://blog.csdn.net/qq_37211608/article/details/81363121