(Filter + Listener )Day18
Filter过滤器
filter是对客户端访问资源的过滤,符合条件的放行,不符合的不放行,并且可以对目标资源访问前后进行逻辑处理。
设置步骤
- 创建类实现Filter接口
- 在 doFilter 方法中编写放行和拦截的代码
- 在 web.xml 文件中进行配置
<filter>
<display-name>UserFilter</display-name>
<filter-name>UserFilter</filter-name>
<filter-class>com.zhiyou100.filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserFilter</filter-name>
<url-pattern>/*</url-pattern>
<servlet-name>MyServlet01</servlet-name>
</filter-mapping>- 对于<url-pattener> /* </url-pattener> 将路径配置为 /* 就是拦截所有的请求
- 也可以配置<servlet-name> MyServlet </servlet-name> 表示指拦截指定的servlet
- url-pattener 和 servlet-name 可以同时配置多个
<filter-mapping>
<filter-name>UserFilter</filter-name>
<servlet-name>MyServlet01</servlet-name>
<servlet-name>MyServlet02</servlet-name>
<url-pattern>*.do</url-pattern> <url-pattern>*.action</url-pattern> </filter-mapping>
urlpattern
- 完全匹配 /servlet ,也可以使用<servlet-name> servlet </servlet-name>
- 目录匹配
- /aaa/bbb/* 使用情况较多
- /user/* 访问前台的资源进入此过滤器
- /admin/* 访问后台的资源执行此过滤器
- 扩展名匹配 *.adc *.jsp *.action
- /* 拦截所有,包括静态资源和jsp页面
- 目录匹配和扩展名匹配不能同时使用,会造成服务器无法正常启动
- 如果有多个filter ,按照web.xml 中 <filter-mapping> 标签前后顺序进行过滤,并不依照<filter>的前后顺序
dispatcher:访问的方式(了解)
- REQUEST :默认值,代表直接访问某个资源执行的filter
- FORWARD: 转发时才执行filter
- INCLUDE : 包含资源时执行 filter
- ERROR :发生错误时进行跳是执行filter
生命周期
- 服务器启动到时候 init 方法调用, filter 被创建
- 服务器关闭的时候destory方法调用,filter被销毁
- 当有请求过来并符合拦截规则的时候 dofilter 方法执行
应用
权限限制
- 实例:用户不登陆不允许访问浏览器其他内容
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
User u = (User) req.getSession().getAttribute("user");
String path = req.getServletPath();
if (path.equals("/index.jsp") || path.equals("/login")) {
chain.doFilter(request, response);
return;
}
if (u == null) {
res.sendRedirect(req.getContextPath() + "/index.jsp");
return;
}
chain.doFilter(request, response);
}
}
全局编码
- 设置 request,response 的编码格式
tomcat内置编码过滤器设置
自动登录过滤器
Listener监听器
监听器就是监听某个对象的的状态变化的组件,其主要是监听三个域对象(ServletContext 域,HttpSession域,ServletRequest域)的创建和销毁以及域对象内的属性的改变,一共有6+2个
ServletContextListener
监听ServletContext域的创建和销毁
设置步骤
- 写一个监听器类去实现监听器接口
- 覆盖接口方法
- 在web.xml中进行配置
应用范围
- 加载配置文件,spring中加载配置文件使用
HttpSessionListener
监听session的创建和销毁
应用范围
- 统计网站的访问数量
对象放在session中一共有四种状态
- 1. 绑定状态:就一个对象被放到session域中
- 2. 解绑状态:就是这个对象从session域中移除了
- 3. 钝化状态:是将session内存中的对象持久化(序列化)到磁盘
- 4. 活化状态:就是将磁盘上的对象再次恢复到session内存中
session中的绑定的对象相关的监听器(对象感知监听器)
绑定与解绑的监听器HttpSessionBindingListener
- 此接口是需要对象去实现,并且不需要去注册
钝化与活化的监听器HttpSessionActivationListener
- 实质上就是session中对象的序列化和反序列化,可用于服务器的优化,所以需要将放在session 中的对象实现此接口,如果需要对象存在磁盘中,需要当前类实现Serializable接口
服务器的优化处理
- 通过一个xml文件进行配置session中的对象多久被钝化
在METAINF中创建一个名字为context.xml文件 将下面代码拷贝进文件
- 通过一个xml文件进行配置session中的对象多久被钝化
注解
注解Annotation是一种属于代码级别的说明,是一种具有功能的说明.是从jdk1.5版 本以后添加的新特性,其格式为@注解名称.对比注释而言,注释是写给人看的,是没有功能的文字. 注解是写个JVM看的,具有功能的代码
注解的作用
在目前的主流应用在替代配置文件
- 对比servlet2.5,Servlet3.0新加了很多的新特性,其中就有提供了注解的支持,也就是不需要使用 web.xml可以进行路径的配置
- 优点:开发效率高
- 确定:耦合性太强,不便于维护
常见注解
@Override:告知编译器此方法是覆盖父类的
@Deprecated:标注过时
@SuppressWarnings:压制警告
自定义注解(了解)
- 使用关键字@interface表示注解
- 注解中定义的属性格式为修饰符 数据类型 属性名称() default 具体的值;
- 修饰符只能是public abstract,和接口相同会默认添加
- 数据类型可以是:基本类型,String,枚举类型,注解类型,Class类型,以上类型的一维数组类型
- default是默认值可以不写,如果不写在使用注解的时候就必须进行设置,如果有默认值就可以 不用进行设置
- 注意:如果属性的名字是value,并且注解的属性设置的时候只需设置这一个 那么在使用注解时 可以省略value
使用注解(掌握)
在类,方法,字段 上面是@注解名称(属性名=属性值,属性名=属性值)
元注解
可以认为是注解的注解
- SOURCE: 注解在源码级别可见(默认是source级别)
- CLASS:注解在字节码文件级别和源码级别可见
- RUNTIME:注解在整个运行阶段以及之前的两个级别都可见
- 注意:要想解析使用了注解的类 , 那么该注解的Retention必须设置成Runtime
- FIELD:字段上可用此注解 METHOD:方法上可以用此注解
- TYPE:类/接口上可以使用此注解
- PARAMETER:参数上可以使用
- CONSTRUCTOR:构造函数上可以使用
- LOCAL_VARIABLE:局部变量上可以使用
(Filter + Listener )Day18的更多相关文章
- 过滤器模式(Filter Pattern)
过滤器模式 一.什么是过滤器模式 过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型 ...
- sqlserver 筛选索引(filter index)在使用时需要注意的事项
sqlserver 的筛选索引(filter index)与常规的非筛选索引,加了一定的filter条件,可以按照某些条件对表中的字段进行索引,但是filter 索引在查询 使用上,并不等同于常规的索 ...
- 执行监听器( Execution listener)
相关类: org.activiti.engine.delegate.ExecutionListener org.activiti.engine.delegate.TaskListener org.ac ...
- Spring Security(2):过滤器链(filter chain)的介绍
上一节中,主要讲了Spring Security认证和授权的核心组件及核心方法.但是,什么时候调用这些方法呢?答案就是Filter和AOP.Spring Security在我们进行用户认证以及授予权限 ...
- 任务侦听器(Task listener)
任务侦听器:用于在任务相关的事件发生时执行一段java逻辑或者是表达式 <userTask id="myTask" name="My Task" > ...
- Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)
一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...
- Python学习笔记系列——高阶函数(filter/sorted)
一.filter #filter()函数用于过滤序列.和map()类似,也接收一个函数和一个序列,把函数依次作用于每个元素,根据返回值是True还是False决定是否保留该元素. #filter()函 ...
- Cannot call sendError() after the response has been committed(filter问题)
就是因为执行了filter的dofilter方法中 chain.doFilter(request,response)了 执行了两遍 if(){}else{chain.doFilter(request, ...
- Spring Boot 知识笔记(Filter过滤器)
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 htm ...
随机推荐
- 题解 洛谷 P3340 【[ZJOI2014]星系调查】
根据题意,发现题目中的图,其实就是一颗树或者是一颗基环树,每个节点上有一个点对\((x,y)\),每次询问为给定端点,找一条直线到端点间的所有点的距离之和最小. 设这条直线为\(y=kx+b\),根据 ...
- Android Studio采坑记录
折腾了几个月的Android Studio,终于在今天被我搞定了 ( ̄▽ ̄)~* 开贴记录下,免得下次再次采坑 先说下我之前电脑的环境配置吧,sdk是几年前在网上下载别人整理出来的包,一直没有更新过 ...
- idea2020安装教程
2019最新版IDEA亲测可用, 2020最新版IDEA亲测可用, 重要的事说三遍: 如果自己破解不成功建议加群咨询群主:422167709 成功的也可以进群交流 激活码1 N757JE0KCT- ...
- ~~并发编程(十一):GIL全局解释锁~~
进击のpython ***** 并发编程--GIL全局解释锁 这小节就是有些"大神"批判python语言不完美之处的开始 这一节我们要了解一下Cpython的GIL解释器锁的工作机 ...
- std:ios:sync_with_stdio (false)以及局限性
如何在输入输出上提高一下效率emmmm #include<iostream> #include<stdio.h> #include<stdlib.h> #inclu ...
- 找回 Virtuoso 中的缩放和角度
https://www.cnblogs.com/yeungchie/ 打开要缩放的版图 CIW 中运行:dbCreateXformPCell(geGetEditCellView() geGetEdit ...
- 4.28 省选模拟赛模拟赛 最佳农场 二维卷积 NTT
第一次遇到二维卷积 不太清楚是怎么做的. 40分暴力比对即可. 对于行为或者列为1时 容易想到NTT做快速匹配.然后找答案即可. 考虑这是一个二维的比对过程. 设\(f_{i,j}\)表示以i,j为右 ...
- Hadoop学习之基础环境搭建
期望目的 基于VMware workstation 10.0 + CentOS 7 + hadoop 3.2.0,在虚拟机上搭建一套Hadoop集群环境,总共包含4个节点,其中1个master节点.3 ...
- Java对象(创建过程、内存布局、访问方法)
(Java 普通对象.不包括数组.Class 对象等.) 对象创建过程 类加载 遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化.如果没有就进行类加载. 分配内存 ...
- 笨办法学python3代码练习ex23.py 字符串字节串字符编码
首先简单说一下字符编码的问题.平常遇到比较多的就是ASCII码(全称:美国信息交换标准码).ASCII码使用一个字节(8位)来表示一些常见的数字.英文字母以及一些控制字符.英语用128个符号编码就够了 ...