1.Servlet规范中三大技术:Servlet,Filter,Listener
2.Filter:对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行 拦截,从而实现一些特殊的功能.
3.Filter作用:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
4.Filter的工作原理图:
5.Filter的使用:声明一个Java类,让这个类实现javax.servlet.Filter接口,在web.xml注册这个过滤器 类。注册的顺序决定过滤器在过滤器链中的执行顺序。
eg:/**
-
过滤器
-
@author sx
-
@version 1.0 2019年1月15日
*/
public class FirstFilter implements Filter{public FirstFilter() {
System.out.println(“实例化FirstFilter”);
}public void destroy() {
System.out.println(“销毁FirstFilter”);}
/**
-
过滤器的处理拦截的请求和响应的方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println(“进入FirstFilter的处理方法”);
//放行:调用下一个过滤或服务器
chain.doFilter(request, response);System.out.println(“结束FirstFilter的处理方法”);
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println(“初始化FirstFilter”);}
}
FirstFilter com.qf.webday12.filter.FirstFilter FirstFilter /*<!-- 注册过滤器 -->
-
6.Filter的生命周期:在发布Web项目时,就实例化Filter(一生只实例化一次),再调用init方法完成初始化 (一生只初始化一次)。当客户端发送请求时就调用过滤器中的doFilter方法,执行放行 之前的代码,当服务器响应信息时就调用过滤器中的doFilter方法,执行放行之后的代 码,doFilter方法可以调用多次,在服务器终止时就调用destroy(一生只实例化一次) 销毁Filter实例释放资源。
7.字符编码过滤器:
eg:/**
-
字符编码过滤器
-
@author sx
-
@version 1.0 2019年1月15日
*/
public class CharsetFilter implements Filter {/**
- Default constructor.
*/
public CharsetFilter() {
// TODO Auto-generated constructor stub
}
/**
- @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
-
处理拦截的请求和响应的方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//处理响应的字符编码
response.setCharacterEncoding(“utf-8”);
//处理Post请求的字符编码
request.setCharacterEncoding(“utf-8”);
//处理get请求的字符编码
HttpServletRequest request2=(HttpServletRequest) request;
if (“get”.equalsIgnoreCase(request2.getMethod())) {
request2=new MyRequest(request2);
}chain.doFilter(request2, response);
}
/**
-
处理get请求的乱码
-
@author sx
-
@version 1.0 2019年1月15日
*/
class MyRequest extends HttpServletRequestWrapper{
String method="";public MyRequest(HttpServletRequest request) {
super(request);
method=request.getMethod();
}@Override
public String getParameter(String name) {
String value1=super.getParameter(name);
if (value1!=null) {
try {
value1=new String(value1.getBytes(“ISO-8859-1”), “utf-8”);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}return value1;
}
@Override
public String[] getParameterValues(String name) {
String[] values=super.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (values[i]!=null) {
try {
values[i]=new String(values[i].getBytes(“ISO-8859-1”),“utf-8”);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return values;
}
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
- Default constructor.
8.登录权限验证过滤器:已经登录的用户直接可以作后面的操作,没登录过用户拦截,跳转到登录页面
放行:请求登录的Jsp页面(login.jsp),登录Servlet(action=login),登录过的用户(session),请求注册 页面(html),注册Servlet(action=register),请求验证码(CheckCodeServlet2),欢迎页面(html) 放行。
eg: /**
-
登录权限验证过滤器
-
@author sx
-
@version 1.0 2019年1月15日
*/
public class PowerFilter implements Filter {/**
- Default constructor.
*/
public PowerFilter() {
// TODO Auto-generated constructor stub
}
/**
- @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
- 处理拦截请求和响应的方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request2=(HttpServletRequest) request;
HttpServletResponse response2=(HttpServletResponse) response;
String uri1=request2.getRequestURI();
String action=request2.getParameter(“action”);
//如果是请求登录的Jsp页面(login.jsp),登录Servlet(action=login),登录过的用户(session),请求注册页面(html),注册Servlet(action=register),请求验证码(CheckCodeServlet2),欢迎页面(html)放行
if (uri1.endsWith(“login.jsp”)||“login”.equals(action)||request2.getSession().getAttribute(“uname”)!=null||“register”.equals(action)||uri1.endsWith(“CheckCodeServlet2”)) {
chain.doFilter(request, response);
}else {
response2.setContentType(“text/html”);
response2.getWriter().write(“你还没有登录,无法操作,3秒跳转到登录页面”);
response2.setHeader(“refresh”, “3;url=login.jsp”);
}
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
- Default constructor.
9.监听器:监听web项目中常用的对象和对象的属性。
10.监听器作用:
10.1.监听web对象创建与销毁.
10.2.监听web对象的属性变化。
11.监听器的机制:事件源,监听器,注册监听。
12.创建监听器:创建一个Java类,实现监听器接口,重写监听器的方法,在web.xml中注册。
com.qf.webday12.listener.MyRequestListener
13.监听器的分类
13.1:对象监听器
ServletContextListener:监听web对象的创建和销毁。
HttpSessionListener(session的生命期间):监听Session会话对象的创建和销毁。
ServletRequestListener:监听请求对象创建和销毁。
13.2:属性监听器
ServletContextAttributeListener:监听web对象的属性的变化。
HttpSessionAttributeListener:监听Session会话对象的属性的变化。
ServletRequestAttributeListener :监听请求对象的属性的变化。