版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coder_Boy_/article/details/82748187
Servlet过滤器Filter
案例演示:
工程案例目录结构
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>Jsp06</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
</dependencies>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Jsp06</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>hi</servlet-name>
<servlet-class>web.HiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hi</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
<filter>
<filter-name>first</filter-name>
<filter-class>web.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/hi</url-pattern>
</filter-mapping>
<filter>
<filter-name>second</filter-name>
<filter-class>web.SecondFilter</filter-class>
<!-- 预置一个参数 -->
<init-param>
<param-name>city</param-name>
<param-value>北京</param-value>
</init-param>
</filter>
<!-- 多个Filter之间的顺序以mapping顺序为准 -->
<filter-mapping>
<filter-name>second</filter-name>
<url-pattern>/hi</url-pattern>
</filter-mapping>
</web-app>
FirstFilter.java
package web;
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 FirstFilter implements Filter{
public void destroy() {
System.out.println("销毁FirstServlet");
}
/**
* 实现过滤(拦截)的方法
* @param req Filter所过滤的请求的request对象
* @param res Filter所过滤的响应的response对象
* @param chain 过滤链对象,用来实现过滤
*/
public void doFilter(ServletRequest req,
ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("First过滤前");
chain.doFilter(req, res);
System.out.println("First过滤后");
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("初始化FirstFilter");
}
}
SecondFilter.java
package web;
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 SecondFilter implements Filter{
public void destroy() {
System.out.println("销毁SecondFilter");
}
public void doFilter(ServletRequest req,
ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("Second过滤前");
chain.doFilter(req,res);
System.out.println("Second过滤后");
}
/**
* 1.服务器在调用init前会自动创建FilterConfig
* 2.服务器会自动读取web.xml中的参数存入FilterConfig
* 3.服务器在调用init时会自动传入FilterConfg
*/
public void init(FilterConfig cfg) throws ServletException {
System.out.println("初始化SecondFilter");
System.out.println(cfg.getInitParameter("city"));
}
}
HiServlet.java
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class HiServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
System.out.println("调用HiServlet。。。。");
HttpSession session = req.getSession();
session.setAttribute("x", 2);
}
}
扫描二维码关注公众号,回复:
3405489 查看本文章
将Jsp06工程部署到Tomcat上,运行Tomcat启动案例工程,
在启动Tomcat过程中控制台显示,过滤器init方式会自动执行
浏览器录入http://localhost:8080/Jsp06/hi 即可:如果没有错误,最终控制台显示效果应如下图:
A
、
B
可以看到过滤器执行顺序以web.xml中mapping定义顺序为准
拓展:监听器
A. web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,
比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。
B. 监听器常用的用途
通常使用Web监听器做以下的内容:
统计在线人数,利用HttpSessionLisener
加载初始化信息:利用ServletContextListener
统计网站访问量
实现访问监控
基于上面的案例来演示
编写监听器
MyListener.java
package web;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyListener implements HttpSessionListener,HttpSessionAttributeListener{
public void attributeAdded(HttpSessionBindingEvent e) {
System.out.println("向session中添加数据");
System.out.println(e.getSession());
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
//session创建事件,创建session时自动触发
public void sessionCreated(HttpSessionEvent e) {
System.out.println("创建session");
System.out.println(e.getSession());
}
//session销毁事件,销毁session时自动触发
public void sessionDestroyed(HttpSessionEvent e) {
System.out.println("销毁session");
}
}
在web.xml中添加监听配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Jsp06</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>hi</servlet-name>
<servlet-class>web.HiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hi</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
<filter>
<filter-name>first</filter-name>
<filter-class>web.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/hi</url-pattern>
</filter-mapping>
<filter>
<filter-name>second</filter-name>
<filter-class>web.SecondFilter</filter-class>
<!-- 预置一个参数 -->
<init-param>
<param-name>city</param-name>
<param-value>北京</param-value>
</init-param>
</filter>
<!-- 多个Filter之间的顺序以mapping顺序为准 -->
<filter-mapping>
<filter-name>second</filter-name>
<url-pattern>/hi</url-pattern>
</filter-mapping>
<listener>
<listener-class>web.MyListener</listener-class>
</listener>
</web-app>
再次将Jsp06工程部署到Tomcat上,运行Tomcat启动案例工程,
浏览器首次录入http://localhost:8080/Jsp06/hi 即可:如果没有错误,最终控制台显示效果应如下图: