1.过滤器(Filter)
过滤器(拦截器)是拦截请求(Request)的对象,可动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息;一个过滤器可以过滤N个请求
作用:
- 在客户端的请求访问后端资源之前,拦截这些请求
- 在服务器的响应发送回客户端之前,处理这些响应
1.1:Servlet 过滤器方法
过滤器实现了 javax.servlet.Filter 接口,javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 请求被过滤器拦截,当客户端的请求与过滤器设置的 URL 匹配时,Servlet 容器将先调用过滤器的 doFilter 方法。FilterChain 用于访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
1.2: 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" id="WebApp_ID" version="2.5">
<display-name>jsp_filter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 配置过滤器 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.zking.filer.MyFilter</filter-class>
<!-- 配置过滤器的初始化参数 -->
<!-- 参数一 -->
<init-param>
<!-- 参数名 -->
<param-name>name</param-name>
<!-- 参数值 -->
<param-value>张三</param-value>
</init-param>
<!--参数二 -->
<init-param>
<!-- 参数名 -->
<param-name>sex</param-name>
<!-- 参数值 -->
<param-value>男</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<!-- 设置过滤器要被过滤的请求 -->
<!-- 过滤单个请求:过滤访问index1.jsp的请求 -->
<url-pattern>/index1.jsp</url-pattern>
<url-pattern>/index2.jsp</url-pattern>
<!-- 过滤指定后缀名的请求 -->
<!-- 所有请求 只要是以.jsp结尾的都会被 过滤 -->
<url-pattern>*.jsp</url-pattern>
<!--过滤所有以.do结尾的;该处后缀名可随便写,可过滤整个项目里后缀名为.do的请求 -->
<url-pattern>*.do</url-pattern>
<!-- 过滤指定目录的请求 -->
<url-pattern>/home/index.jsp</url-pattern>
<!-- 过滤项目里的所有请求/包括所有后缀 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
1.3:编码设置&登录验证
package com.zking.filer;
import java.io.IOException;
import java.io.PrintWriter;
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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//配置过滤单个请求
/*@WebFilter("/index.jsp")*/
//配置过滤多个请求
//@WebFilter("/index.jsp")
//配置多个请求
@WebFilter(
filterName="myFilter",//配置过滤器的名字,等同于:<filter-name>myFilter</filter-name>
//urlPatterns= {"index.jsp","index2.jsp"},//配置过滤多个页面
urlPatterns= {"/*"},//过滤所有页面
//配置初始化参数
initParams= {
@WebInitParam(name="name",value="张三"),
@WebInitParam(name="sex",value="男")
}
)
public class MyFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
//System.out.println("过滤器被销毁");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
//System.out.println("请求被过滤器拦截");
//转换参数类型:arg0和arg1
HttpServletRequest req=(HttpServletRequest)arg0;
HttpServletResponse resp=(HttpServletResponse)arg1;
//设置编码
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
//获取out内置对象
PrintWriter out=resp.getWriter();
//访问登录页面的请求不被过滤
//获取过滤器所连接的请求到底是什么请求?
String uriPath=req.getRequestURI();
//System.out.println("请求地址:"+uriPath);
//indexOf("要查找的字符串")如果找不到返回-1
if(uriPath.indexOf("login.jsp")!=-1) {//>-1或!=-1都可,找到了,则意味着该请求是访问login.jsp
//继续前进
arg2.doFilter(arg0, arg1);
return;
}
if(uriPath.indexOf("register.jsp")>-1) {//>-1或!=-1都可,找到了,则意味着该请求是访问register.jsp
//继续前进
arg2.doFilter(arg0, arg1);
return;
}
//登录验证
//获取session
HttpSession session=req.getSession();
//获取session里面保存的name
Object name= session.getAttribute("name");
if(null!=name) {//已经登录
//继续前进
arg2.doFilter(arg0, arg1);
}else {//没登录
out.print("<script>alert('请先登录!');location.href='login.jsp'</script>");
}
//放行/继续前进*****
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
//启动Tomcat服务
// System.out.println("过滤器初始化/过滤器被创建!");
//获取配置的初始化参数
// String name=arg0.getInitParameter("name");
// String sex=arg0.getInitParameter("sex");
// System.out.println(name);
// System.out.println(sex);
}
}
2.监听器(listener)
监听器(不需要配置,但是监听器仍需要进行注册)就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
2.1:Servlet监听器分为三大类
- 数据域对象创建和销毁监听器
- 数据域对象和属性变更监听器
- 绑定到 HttpSession 域中的某个对象的状态的事件监听器
2.2:配置监听器
//方法一
<listenner>
<listenner-class>地址 </listenner-class>
</listenner>
//方法二
@WebSevlet("")
2.3:方法
public class MyListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("应用程序初始化");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("应用程序被销毁");
}
}