第一次Filter过滤器的简单使用总结(一)

                                                                                                              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都会在访问前进行拦截计数,进行了全局的控制。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值