过滤器监听器
一.过滤器
Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。
使用 Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中, 可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的 顺序执行。
在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据。
在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据 需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。
1.实现流程:
1、创建普通java类
2、实现javax.servlet.Filter的接口,并实现对应的方法
3、配置web.xml
doFilter()
处理请求
chain.doFilter()才能放行资源;
写在前面的是处理请求数据,写在后面是处理响应数据
public class Filter01 implements Filter {
/**
* 初始化...
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init01 ....");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter01...");
// 处理请求的数据
// 放行
chain.doFilter(request, response);
// 处理处理响应的数据
System.out.println("Filter01 end...");
}
@Override
public void destroy() {
System.out.println("destory01.....");
}
}
2.url-pattern 的配置:
①配置具体路径/index.html/TestServlet.do
②带有通配符的配置*.do /* /user/* *.html *.jsp
<filter>
<filter-name>Filter01</filter-name><!--用于为过滤器指定一个名字,该元素的内容不能为空-->
<filter-class>com.xxx.filter.Filter01</filter-class><!--用于指定过滤器的完整的限定类名-->
</filter>
<filter-mapping><!--用于设置一个filter所负责拦截的资源-->
<filter-name>Filter01</filter-name>
<url-pattern>/*</url-pattern><!--设置filter所拦截的请求路径(过滤器关联的URL样式)-->
</filter-mapping>
二.监听器
1.介绍:
web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中 的特定事件, 比如ServletContext, HttpSession,ServletRequest 的创建和销毁;变 量的创建、销毁和修改等。 可以在某些动作前后增加处理,实现监控。例如可 以用来统计在线人数等。
2.实现:
1)、创建普通Java类,实现指定监听接口,实现对应的方法
2)、在web.xml配置该监听器
step1、创建一个类,并实现 HttpSessionListener 接口,用来检测 Session 的创建和 销毁。 在类中定义一个成员变量用来存储当前的 session 个数。
/**
* 在线人数统计
* 有session被创建,人数加1
* 有session被销毁,人数减1
*/
//实现HttpSessionListener接口
public class OnlineListener implements HttpSessionListener {
//定义一个成员变量用来存储当前的 session 个数
private Integer onlineNumber = 0; // 默认在线人数
public OnlineListener() {
}
/**
* session对象创建时触发
*有session被创建,人数加1
*/
public void sessionCreated(HttpSessionEvent se) {
onlineNumber++;
// 将人数存到application作用域中,因为application域范围是整个web项目(统计访问人数等)
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
/**
* session对象销毁时触发
*有session被销毁,人数减1
*/
public void sessionDestroyed(HttpSessionEvent se) {
onlineNumber--;
// 将人数存到application作用域中
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
}
step2、在 web.xml 中配置该监听器,让监听器生效
<listener>
<listener-class>com.shsxt.listener.OnlineListener</listener-class>
</listener>
step3、做一个测试的 Servlet 用来登录,和显示当前在线人数
public class OnlineServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建session域对象,使监听器触发
HttpSession session = request.getSession();
// 得到存在application域对象中的在线人数
Integer onlineNumer = (Integer) getServletContext().getAttribute("onlineNumber");
// 得到输出流,写出到浏览器,并设置登出链接
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h3>在线人数:"+onlineNumer+"</h3><h4><a href='logoutServlet'>退出</a></h4>");
response.getWriter().close();
// ip--------request.getRemoteAddr()
System.out.println("在线人数:"+onlineNumer+",当前IP:" + request.getRemoteAddr());
}
}
step4、做一个测试的 Servlet 用来登出
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用户退出,销毁session,使监听器触发
request.getSession().invalidate();
// 得到输出流,写出到浏览器,并设置登录链接
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h4><a href='online'>登录</a></h4>");
response.getWriter().close();
}
}