Filter

Hello Filter

1. Filter 概念

Filter就像是一个一个哨卡,用户的请求需要经过Filter,并且可以有多个过滤器。

Filter概念

2. 编写 FirstFilter

开发一个简单的 FirstFilter,用来打印用户访问 ip 地址和访问的页面:

HttpServletRequest request = (HttpServletRequest) req;

doFlilter() 方法中的 req 参数的参数类型是 ServletRequest,需要转换为 HttpPServletRequest 类型方便调用某些方法。

String ip = request.getRemoteAddr();

获取来路用户的 ip 地址

String url = request.getRequestURL().toString();

获取用户访问的页面地址

System.out.printf("%s %s访问了%s %n",date,ip,url);

在控制台打印出来

chain.doFilter(request,response);

过滤器放行,表会继续运行下一个过滤器,或者访问的某个Servlet,jsp,html等等。

package filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstFilter implements Filter {

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;

		String ip = request.getRemoteAddr();
		String url = request.getRequestURL().toString();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = new Date();
		String date = sdf.format(d);

		System.out.printf("%s %s 访问了 %s%n", date, ip, url);
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}

}

3. 配置web.xml

在web.xml进行filter的配置,和servlet的配置很类似:

<url-pattern>/*</url-pattern>

表示所有的访问都会过滤。

如果配置成

<url-pattern>*.jsp</url-pattern>

就表示只过滤jsp。

4. 访问页面

重启tomcat,所有用户的访问信息,都可以打印出来。

5. init()方法

 与Servlet需要配置自启动才会随着tomcat的启动而执行init()方法不一样,Filter一定会随着tomcat的启动而自启动。

登录验证

1. 在Servlet 中进行登录验证的局限性

所有的Servlet都要加上一样的代码,显得很累赘

2. 使用Filter处理

创建一个AuthFilter 类:

String uri = request.getRequestURI();
if(uri.endsWith("login.html")||uri.endsWith("login")){
    chain.doFilter(request,response);
    return;
}

首先判断是否是访问的login.html 和 loginHero,因为这两个页面就是还没有登录之前就需要访问的。

String userName = (String)request.getSession().getAttribute("userName);
if(null == userName){
    response.sendRedirect("login.html");
    return;
}

从Session中获取userName,如果没有,就表示不曾登录过,跳转到登录页面。
 

package filter;
 
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class AuthFilter implements Filter {
 
    @Override
    public void destroy() {
 
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
 
        String uri = request.getRequestURI();
        if (uri.endsWith("login.html") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }
 
        String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            response.sendRedirect("login.html");
            return;
        }
 
        chain.doFilter(request, response);
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
 
    }
 
}

3. 配置web.xml

 配置AuthFilter

	<filter>
		<filter-name>AuthFilter</filter-name>
		<filter-class>filter.AuthFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>AuthFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
		

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值