javaweb高级第五章 过滤器与事件监听
1.本章目标
掌握过滤器和监听器的使用
2.过滤器
生活中:
网,烟嘴,筛子
程序中:
在用户访问资源之前,对访问的请求和响应进行拦截,只有通过了过滤器,才能继续往下执行
通俗来说,过滤器在客户端和服务器之间加了一层保护层
案例:
处理中文乱码
拦截未登录
网络直播中,聊天数据,过滤一些敏感的语句
3.开始应用
步骤:
1.创建一个普通java类,实现Filter接口,重写doFilter,destory,init方法
注意:destory和init方法在整个容器的生命周期中只执行一次
,doFilter在拦截的请求范围内容,每次请求,都会被执行
2.在web.xml中配置过滤
<!-- 配置过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>TestFilter</filter-name>
<!-- 过滤器的类 -->
<filter-class>com.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<!-- 过滤器名称,必须和filter节点中的一样 -->
<filter-name>TestFilter</filter-name>
<!-- /*全不过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
3.如果过滤器通过规则校验,放行请求与要在doFilter中:
chain.doFilter(request, response); 放行代码
4.如果不想使用上述麻烦的配置步骤,可以新建一个Filter,然后再类上添加如下配置
@WebFilter(filterName="/EncodingFilter",urlPatterns="/*")
案例:
添加过滤器,当用户没有登录直接进入欢迎页面时,跳转到登录界面提示用户登录

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>千里之行购物网站</title> <link rel="stylesheet" href="css/index.css" /> </head> <body> <img src="img/bgImg.jpg" class="bgImg" /> <div class="content" > <div class="bidTitle">千里之行购物网站登录</div> <form action="demo2Servlet" method="post" role="form" class="form-horizontal"> <input type="hidden" name="op" value="login"> <div class="logCon"> <div class="line" id="username" ><span>账号:</span> <input class="bt_input" type="text" name="username"/></div> <div class="line" id="password" ><span>密码:</span> <input class="bt_input" type="text" name="password"/></div> <div class="logCon" style="color: red;"> <% String msg=(String)request.getAttribute("msg"); if(msg!=null){ %> <label class="col-sm-2 control-lable"></label> <div class="col-sm-10"> 温馨提示:<%=msg %> </div> <%} %> </div> <button type="su bmit" class="logingBut">登录</button> </div> </form> </div> </body> </html>

body {
text-align: center;
height: 100%;
}
.bgImg {
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
width: 100%;
height: 100%;
}
.logo {
width: 800px;
}
.bidTitle {
color: #e6e6e6;
font-size: 34px;
font-weight: 600;
}
.logCon {
color: #FFFFFF;
margin-top: 40px;
}
.line {}
body .content {
width: 42%;
position: fixed;
background: #0f1a1494;
left: 29%;
padding: 5% 1%;
margin-top: 12%;
border-radius: 5px;
}
body .logingBut {
background: #2d8c5fa6;
border: none;
padding: 12px 0px;
color: #edefee;
border-radius: 2px;
width: 330px;
margin-left: 30px;
margin-top: 5px;
}
body .bt_input {
border-radius: 2px;
border: none;
padding: 11px 5px;
width: 330px;
margin-right: 20px;
color: #333;
margin-left: 5px;
margin-bottom: 18px;
background: #ffffffd9;
}
body .logCon span {
font-size: 18px;
height: 40px;
line-height: 40px;
}

package com.Servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(name="Demo2Servlet",urlPatterns="/demo2Servlet") public class Demo2Servlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session =request.getSession(); String username=request.getParameter("username"); String password = request.getParameter("password"); if("张三".equals(username)&&"123456".equals(password)){ session.setAttribute("login", username); request.getRequestDispatcher("welcome.jsp").forward(request, response); }else{ session.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

package com.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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * Servlet Filter implementation class LoginFilter */ @WebFilter(filterName="LoginFilter",urlPatterns="/*") public class LoginFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //判断是否登录 HttpServletRequest req=(HttpServletRequest)request; HttpSession session=req.getSession(); Object login=session.getAttribute("login"); //获取拦截的请求路径,然后排除掉登录的请求(/demo2Servlet) String servletPath=req.getServletPath(); System.out.println(servletPath); if(servletPath.equals("/demo2Servlet")||servletPath.contains("/css")||servletPath.contains("/img")){ chain.doFilter(request, response); return; } if(login==null){ session.setAttribute("error", "您没有登录,请登录"); request.getRequestDispatcher("login.jsp").forward(request, response); }else { chain.doFilter(request, response); } } public void init(FilterConfig fConfig) throws ServletException { } }
if(servletPath.equals("/demo2Servlet")||servletPath.contains("/css")||servletPath.contains("/img")){
chain.doFilter(request, response);
return;
}
过滤器 排除过滤 否则一直登陆不进去 以及排除css样式和img样式 !!!
4.监听器,
监听request,session,application对象的创建和销毁,以及他们的属性变化
步骤:
1.实现响应的接口
2.在web.xml中配置
整个项目容器运行期间,以下对象产生个数:
request:每次浏览器请求服务器,就会产生一个新request对象,响应完成,request对象就被销毁;存活于一次请求响应过程
session:一个浏览器窗口是一个会话.存活于一个浏览器
application:只有一个
session会话事件:30分钟