Filter过滤器或拦截器
1.常规方式调用资源(即调用servlet或JSP局面)
2.利用修改过的请求信息调用资源。
3.调用资源,但在发送相应到客户端机前面对进行修改。
4.组织该资源的调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
在web.xml文件中,Servlet的匹配规则是一旦有一个匹配,其余的全部都跳过。
然而, Filter则是有一个匹配,就匹配一个,逐个进行。
Filter的定义和作用:
1:Filter是Servlet规范里的一种Java类,继承自javax.servlet.Fileter类
2:它可以拦截请求,在请求访问相应的Servlet前做一些操作,如打印日志。
3:它可以拦截response,在返回给浏览器的时候做一些操作。
使用Filter可以实现简单常用的一些功能
比如我们可以实现全局的计数功能:
这是首先使用的一个CookieUtil的工具类,里面通过Context实现了全局计数功能
package com.qingkecounter.util;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class CookieUtil {
public static void addCount(HttpServletRequest request, HttpServletResponse response){
/*Cookie[] cookies = request.getCookies();
Cookie counter=null;
if(cookies != null){
for (Cookie c : cookies) {
if(c.getName().equals("counter")){
counter=c;
break;
}
}
}
if(counter==null){
counter = new Cookie("counter", "1");
}else{
Integer count = Integer.parseInt(counter.getValue());
count++;
counter.setValue(count.toString());
}
response.addCookie(counter);
request.setAttribute("counter",counter.getValue());*/
HttpSession session = request.getSession();
if(session.getAttribute("count")!=null){
int count = (Integer)session.getAttribute("count");
count++;
session.setAttribute("count", count);
}else{
session.setAttribute("count", 1);
}
ServletContext context = request.getServletContext();
if(context.getAttribute("allcount")!=null){
int count1 = (Integer)context.getAttribute("allcount");
count1++;
context.setAttribute("allcount", count1);
}else{
context.setAttribute("allcount", 1);
}
}
}
我们接下来将jsp的代码也展示一下
<%@ 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>Insert title here</title>
</head>
<body>
<h3>您本次消费一共访问了<%=session.getAttribute("count") %>次页面</h3>
<h2>EarthMan一共访问了<%=session.getServletContext().getAttribute("allcount")%>次页面</h2>
</body>
</html>
我们整个项目的内容是一个基于美容院的一个小程序,所以会有人来访问。
我们将所有的功能的servlet中调用CookieUtil类中的addCount方法全部清除,将该方法写入我们的拦截器中调用。
package com.qingkecounter.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.HttpServletResponse;
import com.qingkecounter.util.CookieUtil;
/**
* Servlet Filter implementation class CountFilter
*/
@WebFilter("/*")
public class CountFilter implements Filter {
public CountFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// place your code here
CookieUtil.addCount((HttpServletRequest)request,(HttpServletResponse)response);
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
这样子每个servlet都会在访问前进行拦截计数,进行了全局的控制。