过滤器 Filter(javaweb)
1. 过滤器的作用
2. 使用步骤
-
"创建普通的java类" 或者 "直接创建Filter类型的文件"
两者不同之处在于:普通的java类需要自己手动来实现Filter接口以及Filter接口的三个方法(init()、destory()、doFilter()
)
-
配置web项目的web.xml(这里也和Servlet的配置方法相似)
注:配置需要拦截的资源的几种方式:
以指定资源匹配,如:“/login.jsp
”
以目录匹配,如:“/servlet/*
”
以后缀名匹配,如:“.jsp
”
通配符匹配,拦截所有web资源,如:“/*
”
其他配置(dispatcher是个枚举类型,有下面几个值可以选择,默认为REQUEST)
3.案例实现:
当我们在访问优快云博客的时候,会发现没有登陆,就不能够访问个人主页,只有登陆过才可以访问个人主页。
现在我们就来模拟下这个功能。(上述的 “个人主页” 由下面的 “登陆成功页面” 代替)
实现拦截用户的非法请求 : “当客户端直接发送请求访问loginSuccess.jsp(登陆成功页面)时,需要拦截该请求,给用户再次显示login.jsp(登陆页面)。”
1). 执行效果:
成功实现拦截用户直接访问登陆成功页面(loginSucccess.jsp)
2). 实现核心源代码如下:
Filter过滤器部分源代码:
public class pageFilter implements Filter{
//Filter过滤器的doFilter()方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest)request;
HttpServletResponse hres = (HttpServletResponse)response;
HttpSession session = hreq.getSession();
//hreq.getContextPath()得到:/项目名
String path1 = hreq.getContextPath() + "/login.jsp";
String path2 = hreq.getContextPath() + "/register.jsp";
if(session != null && session.getAttribute("user") != null){
//session中存在用户信息时,说明已成功登陆过,过滤器放行
chain.doFilter(request, response);
}else if(path1.equals(hreq.getRequestURI()) || path2.equals(hreq.getRequestURI())){
//访问地址合法时,过滤器放行
chain.doFilter(request, response);
}else{
//否则就拦截,跳转至登录页面
System.out.println("请求不合法,Filter已拦截请求...");
hres.sendRedirect(hreq.getContextPath() + "/login.jsp");
}
}
}
配置文件:
<filter>
<filter-name>filterOne</filter-name>
<filter-class>filter.pageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filterOne</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
*注:在运行项目的时候,可以看到Tomcat启动的时候,就会创建Filter,常驻内存。也就是说服务器一启动就会执行Filter的init( )方法;当服务器关闭的时候,就会执行Filter的destory( )方法。
4. 多个Filter的执行顺序
1). 在web.xml中,filter执行顺序跟的顺序有关,先声明的先执行。
2). 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关。
3). 如果既有在web.xml中声明的filter,也有通过注解配置的filter,那么会优先执行web.xml中配置的filter。
5.过滤器 和 Servlet相似:
都需要“请求对象:request" 和 “响应对象:response”
其中,HttpServletRequest(Servlet)
和 ServletRequest(Filter)
都是接口。HttpServletRequest
继承自ServletRequest
,HttpServletRequest
比ServletRequest
多了一些针对于Http协议的方法。