我的网站:欢迎访问奥
过滤器和监听器
过滤器
过滤器的作用
Filter过滤器,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理;
编写步骤
写一个类去实现Filter接口,并实现接口中的所有方法;
在web.xml中配置或者使用注解配置【@WebFilter(“过滤器路径”)不推荐】
执行流程
1.会先去匹配过滤器,再是Servlet
2.会先去匹配过滤器(web.xml)
生命周期
服务和销毁跟Servlet一样
出生(实例化和初始化):
默认是在项目部署的时候进行实例化和初始化,好处是可以提高效率,Fiter是单例的
过滤器链
就是多个过滤器
注意:在Servlet中请求不能重复,但是在过滤器里面可以重复,过滤器执行的顺序根据xml配置顺序有关
过滤器的其他配置
过滤器针对一个请求,一个请求执行一次过滤
重定向:多次请求,多次执行
转发:一次请求,执行一次
FilterConfig
ServletConfig – 获取Servlet的初始化参数
FilterConfig – 获取Filter的初始化参数
实现登录拦截
实现只能登录才能访问后面的页面功能,使用过滤器的demo
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配置
<!-- 权限过滤 -->
<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的时候就不会,所以我们用过滤器来进行一个编码解码
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配置
<!-- 编码问题过滤 -->
<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
销毁:服务器关闭或者项目从服务器中移除的时候
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
实现一个统计在线人数的监听器
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页面
<%@ page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>在线人数</title>
</head>
<body>
<h2>当前在线人数:<%=application.getAttribute("count")%></h2>
<input type="button" value="登出" οnclick="location='logout'" />
</body>
</html>
web.xml配置
<!-- 监听器的配置 -->
<listener>
<listener-class>com.ifueen.listener.MyListener</listener-class>
</listener>