过滤器和监听器

过滤器和监听器

过滤器

过滤器的作用

Filter过滤器,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理;

编写步骤

写一个类去实现Filter接口,并实现接口中的所有方法;

在web.xml中配置或者使用注解配置【@WebFilter(“过滤器路径”)不推荐】

执行流程

1.会先去匹配过滤器,再是Servlet

2.会先去匹配过滤器(web.xml)

生命周期

服务和销毁跟Servlet一样

出生(实例化和初始化):

​ 默认是在项目部署的时候进行实例化和初始化,好处是可以提高效率,Fiter是单例的

过滤器链

就是多个过滤器

注意:在Servlet中请求不能重复,但是在过滤器里面可以重复,过滤器执行的顺序根据xml配置顺序有关

过滤器的其他配置

过滤器针对一个请求,一个请求执行一次过滤

重定向:多次请求,多次执行

转发:一次请求,执行一次

FilterConfig

ServletConfig – 获取Servlet的初始化参数

FilterConfig – 获取Filter的初始化参数

实现登录拦截

实现只能登录才能访问后面的页面功能,使用过滤器的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.ifueen.filter;

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginFilter implements Filter{

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
Object name = request.getSession().getAttribute("name");
if (name==null) {
response.sendRedirect("/index.jsp");
}

//放行
arg.doFilter(req, resp);

}

@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
}

}

web.xml配置

1
2
3
4
5
6
7
8
9
10
<!-- 权限过滤 -->

<filter>
<filter-name>login</filter-name>
<filter-class>com.ifueen.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/system/*</url-pattern>
</filter-mapping>

实现字符编码解码过滤

在使用get请求的时候我们的tomcat会自动进行编码和解码,但是在使用post的时候就不会,所以我们用过滤器来进行一个编码解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.ifueen.filter;

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;

public class EnCodingFilter implements Filter{

FilterConfig config; //定义全局的config

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg)
throws IOException, ServletException {
// TODO Auto-generated method stub
String encoding = config.getInitParameter("encoding");
req.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset="+encoding);
arg.doFilter(req, resp);//执行Servlet代码

}

@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config = config;
}

}

web.xml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 编码问题过滤 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.ifueen.filter.EnCodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

监听器

监听器对象的创建和销毁

监听ServletContext对象的创建和销毁
ServletContext对象的创建和销毁:
创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext
销毁:服务器关闭或者项目从服务器中移除的时候

1
2
3
4
5
6
7
8
9
10
11
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了...");
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了...");
}
}

监听器中的属性变更

ServletContextAttributeListener 对Context的监听

HttpSessionAttributeListener 对Session的监听

ServletRequestAttributeListener 对请求的监听

Demo

实现一个统计在线人数的监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.ifueen.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyListener implements HttpSessionListener{

int count = 1000000;

@Override
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("开始监听");
count+=100;
arg0.getSession().getServletContext().setAttribute("count", count);
}

@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
count-=100;
arg0.getSession().getServletContext().setAttribute("count", count);
System.out.println(count);
}


}

jsp页面

1
2
3
4
5
6
7
8
9
10
11
<%@ page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>在线人数</title>
</head>
<body>
<h2>当前在线人数:<%=application.getAttribute("count")%></h2>
<input type="button" value="登出" onclick="location='logout'" />
</body>
</html>

web.xml配置

1
2
3
4
<!-- 监听器的配置 -->
<listener>
<listener-class>com.ifueen.listener.MyListener</listener-class>
</listener>
❤赏点钱让我买杯快乐水8❤