1 过滤器
- 客户端–过滤器–服务器–过滤器–浏览器
- 过滤器是可以对请求和响应的头、体进行操作的一种特殊web组件
- 过滤器不生成,只拦截请求和响应
1.1 过滤器常用功能
- 分析web请求,对请求进行预处理
- 阻止web请求和响应的进行:百度拦截敏感词汇
- 修改请求、响应的头和体:改编码格式
- 与其他web资源协作:可以选择哪些请求可以经过该过滤器,哪些请求不经过
1.2 自定义过滤器
- 定义普通java类,实现Filter接口,重写其内方法
- init:初始化Filter,tomcat启动时执行
- doFilter:进行处理,每次发送请求都会执行,其内必须调用filterChain.doFilter,才能调用下一个filter或请求所对应的servlet
- destroy:销毁Filter,tomcat关闭时执行
- filterChain:表示过滤器链,在项目中可以定义N多个过滤器,开始执行时,根据用户请求把符合规则的过滤器挨个执行,建议每个过滤器尽量只完成单一功能,防止耦合
package filter;
import javax.servlet.*;
import java.io.IOException;
public class Filter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化第一个filter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入第一个filter");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("离开第一个filter");
}
@Override
public void destroy() {
System.out.println("销毁第一个filter");
}
}
- 配置web.xml
- *或/*:匹配所有请求
- *.do:匹配后缀为do的请求
- /filter.do:匹配指定的filter.do请求
- /*.do、*servlet、filter.do:这几种表示法都不可以
<filter>
<filter-name>Filter1</filter-name>
<filter-class>filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
1.3 登录过滤器
- 当请求/filterservlet时,进入第二个过滤器,判断session中的user属性是否为null
- 如果为null,表示没登录过,跳转到登录页面login.jsp进行登录
- 不为null,表示登录过,直接到filterservlet对应的servlet中进行业务处理
- Filter2
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class Filter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入第二个filter");
if(((HttpServletRequest)servletRequest).getSession().getAttribute("user")==null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
System.out.println("离开第一个filter");
}
@Override
public void destroy() {
}
}
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--模拟登录页面,显式请登录,并创建session后,向session中加属性-->
<%
session.setAttribute("user","user");
%>
请登录
</body>
</html>
- web.xml
<filter>
<filter-name>Filter2</filter-name>
<filter-class>filter.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/filterservlet</url-pattern>
</filter-mapping>
2 监听器
- 允许程序员在request、servletContext、session创建、销毁、属性变动时,进行处理
- request叫做监听对象,ServletRequestListener叫做监听器接口,ServletRequestEvent 叫做监听事件
2.1 监听器示例
- Listener1
package listen;
import javax.servlet.*;
import javax.servlet.http.*;
public class Listener1 implements ServletRequestListener,ServletRequestAttributeListener, ServletContextListener,ServletContextAttributeListener, HttpSessionListener, HttpSessionAttributeListener, HttpSessionActivationListener, HttpSessionBindingListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("增加属性");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("销毁属性");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("属性值被修改");
System.out.println(servletContextAttributeEvent.getName());
System.out.println(servletContextAttributeEvent.getValue());
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("创建ServletContext对象");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被销毁");
}
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
}
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
- FilterServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class FilterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getServletContext().setAttribute("123","1234");
getServletContext().setAttribute("123","123456");
getServletContext().removeAttribute("123");
}
}
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>FilterServlet</servlet-name>
<servlet-class>FilterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FilterServlet</servlet-name>
<url-pattern>/filterservlet</url-pattern>
</servlet-mapping>
<listener>
<listener-class>listen.Listener1</listener-class>
</listener>
</web-app>