Java学习之Filter与Listener

2022-12-29,,,

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学习之Filter与Listener.doc》

下载本文的Word格式文档,以方便收藏与打印。