Java学习之Filter与Listener
0x00前言
web中的Filiter:当客户端访问服务端资源的时候,过率器可以把请求拦截下来,完成一些特殊的功能
完成的操作一般都是通用的作用:列如登录验证。
web中的Listener一般用于加载一些初始化的内容。它们两加上一个Servlet是web最重要的三个组件。
0x01Filiter快速入门
0x1注解配置:
定义一个类,实现Fillter接口
通过注解的方式去配置注解中的括号中的内容是你需要过滤的内容
@WebFilter(value = "*")//访问什么资源的时候就填谁的
public class Filterdemo1 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter被执行了");
chain.doFilter(request,response);//放行操作
}
}
0x2web.xml配置
创建两个标签一个是和和Servlet类似
<filter>
<filter-name>demo100</filter-name>
<filter-class>Filterdemo.Filterdemo1</filter-class>
</filter>
<filter>
<filter-name>demo100</filter-name>
<url-pattern>/*</url-pattern>
<!-- 这里要主要你拦截的路径要主要你的拦截器里面是否已经配置了注解-->
</filter-mapping>
</web-app>
0x3其他方法
public void init(FilterConfig config) throws ServletException {
//在服务器创建的时候会加载Filter它会被正常执行
}
public void destroy() {
//服务器正常关闭的时候它会被执行
}
0x4过滤器配置详解
具体的拦截路径配置:
1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
具体拦截方式的配置
具体资源被访问的方式:直接访问,重定向,转发
如果我们需要使用转发访问资源不被拦截器拦截,可以在注解中配置dispatcherTypes属性的值。
dispatcherTypes 五种属性:
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
看一下demo
@WebFilter(value = "index2.jsp",dispatcherTypes = DispatcherType.REQUEST)
public class Filterdemo2 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器被执行了");
chain.doFilter(request, response);
}
}
0x5过滤器链
1.执行顺序(两个过滤器为例子
过滤器1-->过滤器2-->资源执行-->过滤器2-->过滤器1
两种方式
注解配置:类名字符串比较规则
xml配置:顺序执行
0x02Filter案例
登录案例
@WebFilter(filterName = "Filterdemo3")
public class Filterdemo3 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.contains("/login.jsp")||requestURI.contains("ServletLogin")){
chain.doFilter(req,response);
}else {
Object user = request.getSession().getAttribute("user");
if (user!=null){
chain.doFilter(req,response);
}else {
request.setAttribute("long_msg","fail");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
//chain.doFilter(request, response);
}
}
0x03Listener
1.概念:
事件:一件事情
事件源:事件发生的地方
监听器:一个对象
注册监听:将事件源,事件,监听器,绑定在一起。当事件源上发生某件事情的时候,执行监听器代码
0x1方法
定义一个类:实现ServletContextListener接口
@Override
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is initialized(when the Web application is deployed). */
//ServletContext被创建后会执行方法(服务器)
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
/* This method is called when the servlet Context is undeployed or Application Server shuts down. */
//ServletContext被销毁之前会执行方法(服务器)
}
在xml中配置
<listener>
<listener-class>Lister.Listenerdemo1</listener-class>
</listener>
0x2看一个xml的案例
@WebListener
public class Listenerdemo1 implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {
public Listenerdemo1() {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is initialized(when the Web application is deployed). */
ServletContext servletContext = sce.getServletContext();
String initParameter = servletContext.getInitParameter("web.xml");//通过键值对的方式获取的
String realPath = servletContext.getRealPath(initParameter);
try {
FileInputStream fileInputStream = new FileInputStream(realPath);
System.out.println("执行了");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
0x3通过注解来配置
很简单就是在前面加一个@WebListener,一般监听器在框架中我们只需要配置一下就可以了。
@WebListener
public class Listenerdemo1 implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener
0x4结尾
web三大组件基本上学完了Servlet Filiter Listener,这三大插件在后面的框架学习的时候还会接触,后面还有一些零散的内容过后就要进入到框架的学习了。
Java学习之Filter与Listener的更多相关文章
- 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...
- Filter、Listener 学习总结
今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...
- Java学习资源
Java技术路线图 指路明灯 一位资深程序员大牛给予Java初学者的学习路线建议 Java源码阅读的真实体会 概要 JDK发展历程 Java项目经验 基于java平台的常用资源 官方文档 Java™ ...
- java学习路线(好资源大家分享)
对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...
- 转:Java学习路线图
作者: nuanyangyang 标 题: Java学习路线图(整理中,欢迎纠正) 发信站: 北邮人论坛 (Mon Aug 11 19:28:16 2014), 站内 [以下肯定是不完整的列表, ...
- 最新java学习路线:含阶段性java视频教程完整版
最新java学习路线:带阶段性java视频教程版本 第一阶段:Java基础 学习目标: 掌握基本语法.面向对象.常用类.正则.集合.Io流.多线程.Nio.网络编程.JDK新特性.函数式编程 知识点细 ...
- Java Servlet (1) —— Filter过滤请求与响应
Java Servlet (1) -- Filter过滤请求与响应 版本: Java EE 6 参考来源: Oracle:The Java EE 6 Tutorial: Filtering Reque ...
- Java学习路线图(如何快速学Java)
不知不觉从初学Java到现在已经8年了,今天在这里给刚入门和入门不久的小伙伴们一些建议.可能总结的不是很详细,但给出了一个大概的学习路线.希望对大家有帮助哈~ 如何快速学Java 这里我以Java E ...
随机推荐
- 事物的隔离性和MVCC
事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务.我们知道事务有一个叫隔离性的特性, ...
- 【java】学习路线13-多态继承
/*多态创建一个父类的对象,用子类去初始化如果要使用子类的方法,则需要把对象强制转换为子类的(xx)xxx*/public class Learn01{ public static void m ...
- ABAQUS和UG许可证冲突问题的解决方案
前段时间重新安装了ABAQUS,更新到了2020版本后,发现NX UG怎么突然打不开了,搜索一下,发现是两个许可证有冲突.找了很多解决方案,主要归纳为以下两种: 方法一:Lmtools修改法 先说结论 ...
- DIN 66025标准下G Code基础代码释义
基础/前提 XYZ指示常规的三个轴号,PQUVW为可以增加的五个轴,ABC为可以增加的旋转轴 实例 G0 快速定位(点位运动) G1 直线运动(插补) G2 顺时针圆弧运动(插补) G3 逆时针圆弧运 ...
- 第五十五篇:Axios的封装
好家伙, 上图 1.为什么需要封装axios? 当我们改变项目的使用环境时候,url也会随之改变,那么我们就需要改很多axios请求中的url配置 现在我们将axios封装,在项目使用环境改变时我们只 ...
- Linux或Docker里安装minio / Docker中安装h5ai
此文为单节点搭建操作 Linux中搭建minio 对象存储服务器 下载minio安装包 wget https://dl.minio.io/server/minio/release/linux-amd6 ...
- MySQL数据库如何线上修改表结构
一.MDL元数据锁 在修改表结构之前,先来看下可能存在的问题. 1.什么是MDL锁 MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用. 当对表 ...
- 【Android 逆向】ARM while 逆向
#include <stdio.h> int dowhile(int n){ int i = 1; int s = 0; do{ s += i; }while(i++ < n); r ...
- winfrom杀死进程及关闭进程
ProcessStartInfo process = new ProcessStartInfo(); process.FileName = AppDomain.CurrentDomain.BaseDi ...
- Java SE 四大内部类
内部类 1.成员内部类 调用成员内部类 //在外面的类的最后,写一个方法,调用成员内部类(创建对象,在访问) class Outer08{ class Inner08{ //成员内部类 public ...