一:过滤器(Filter)
当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器Filter完成。
过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。
1. 实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法:
public void init(FilterConfig filterConfig) throws ServletException
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
public void destroy()
注意:过滤器是在容器启动时自动加载的
*******
FilterChain接口的主要作用是将用户的请求向下传递:
public void doFilter(ServletRequest request, ServletResponse response) throws IOException,ServletException
*******
eg:
package org.afanti.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{
private String encode;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("EncodingFilter初始化了...");
this.encode=filterConfig.getInitParameter("encode");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("进入EncodingFilter的doFilter...");
request.setCharacterEncoding(encode); // 设置请求编码
chain.doFilter(request, response);// “放行”
System.out.println("将要离开EncodingFilter的doFilter...");
}
@Override
public void destroy() {
System.out.println("EncodingFilter销毁了...");
}
}
2. Filter的配置方式
方式一:
注解配置
@WebFilter(filterName="",urlPatterns={"/images/*"},
initParams={
@WebInitParam(name="fruit",value="grape")
})
方式二: web.xml中配置
3. 过滤器的过滤路径配置类型
路径类型一:以目录的方式配置过滤路径: eg: /images/*
路径类型二:以资源类型的方式配置过滤路径: eg: *.jpg
注意: 不能将两种路径类型的配置结合起来,否则Web容器启动时发生错误。
4. 过滤器的应用
(1)编码过滤 : 在过滤器中设置编码
(2)登录验证 : 在过滤器中判断session属性是否为空,从而进行登录验证
二:监听器(Listener)
在WEB中可以对application、session、request三种操作进行监听。
Servlet监听器分为三种:
ServletContext监听器(容器监听器)
HttpSession监听器(会话监听器)
ServletRequest监听器(请求监听器)
*****Servlet监听器的配置方式
方式一: 注解配置: @WebListener
方式二: web.xml中配置:
<listener>
<listener-class>监听器路径</listener-class>
</listener>*****
1. ServletContext监听器
(1).对Web容器状态(生命周期)的监听
实现ServletContextListener接口,覆写相关方法
补充:ServletContextEvent代表容器状态的事件类,里面有个getServletContext()方法
(2).对ServletContext属性范围的监听
实现ServletContextAttributeListener接口,覆写相关方法
2. HttpSession监听器(对会话进行监听)
(1).对会话状态(生命周期)进行监听
实现HttpSessionListener接口,覆写相关方法
(2).对会话(HttpSession)属性范围进行监听
实现HttpSessionAttributeListener接口,覆写相关方法
(3).对会话(HttpSession)属性范围进行监听———使用HttpSessionBindingListener接口
实现HttpSessionBindingListener接口,覆写相关方法
实现了HttpSessionBindingListener接口的类,将该类的对象在会话属性范围绑定和解绑属性时,会自动调用 valueBound(xxx)方法和valueUnbound(xxx)方法。
特别注意:使用HttpSessionBindingListener接口实现会话属性监听时,不用注册!
eg:
add.jsp
<%@ page import="session.SessionBindingListener"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>session属性设置值</title>
</head>
<body>
<%
session.setAttribute("sessionInfo","会话范围的属性值");
SessionBindingListener sb=new SessionBindingListener();
session.setAttribute("bindingInfo",sb);
%>
</body>
</html>
package session;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
// 实现了HttpSessionBindingListener接口的监听器,用来监听session范围的属性,该监听器不用注册!
public class SessionBindingListener implements HttpSessionBindingListener{
@Override
public void valueBound(HttpSessionBindingEvent event) {
String name=event.getName(); // 获取属性名
Object value=event.getValue(); // 获取属性值
System.out.println("绑定(bound)session属性了,属性名是:"+name+";属性值是:"+value);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
String name=event.getName(); // 获取属性名
Object value=event.getValue(); // 获取属性值
System.out.println("解绑(unbound)session(remove)属性了,属性名是:"+name+";属性值是:"+value);
}
}
3.ServletRequest监听器(请求监听器)
(1).对请求状态(生命周期)进行监听
实现ServletRequestListener接口,覆写相关方法
(2).对请求范围的属性进行监听
实现ServletRequestAttributeListener接口,覆写相关方法