JAVAWEB技术之七过滤器
第七章 过滤器
JAVAWEB三大组件:Servlet、Filter、Listener
7.1 概念
7.1.1 描述
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。
它可以让请求得到目标资源,也可以不让请求达到!
过滤器有拦截请求的能力!
过滤器是一个服务器端的组件,它可以拦截客户端的请求和响应信息,并对这些信息进行过滤。
Servlet API中提供了一个Filter接口,如果编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码如下:
7.1.2 生命周期
7.2 应用场景
- 自动登录
- 统一设置编码格式
- 访问权限控制
- 敏感字符过滤等
7.3 快速上手
package javax.servlet;
import java.io.IOException;
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
public void destroy();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
init():初始化方法,创建之后马上执行,Filter会在服务器启动时创建!
destory():销毁方法,销毁之前执行!在服务器关闭的时候销毁!
doFilter(ServletRequest,ServletResponse,FilterChain):每次过滤的时候都会执行,重点就是执行过滤的方法。
如何上手:
1.写一个类实现Filter接口,这个和Servlet是一样的。
public class AFilter implements Filter {
public void destroy() {
System.out.println("销毁了");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤...");
//chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("初始化...");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
2.在web.xml中进行配置;
<!--在web.xml配置Filter,和Servlet类似
/:表示当前web目录,
*:表示所有文件;
-->
<filter>
<filter-name>AFilter</filter-name>
<filter-class>com.tea.filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<!--*:过滤所有;
/index.jsp:只过滤index.jsp页面。
对于其他页面放行。
-->
</filter-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
使用注解来创建Filter,这个是大家要掌握的知识点。
@WebFilter("/index.jsp")
public class TestFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
}
public void init(FilterConfig config) throws ServletException {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
常用配置项
urlPatterns
配置要拦截的资源
- 以指定资源匹配。例如"/index.jsp"
- 以目录匹配。例如"/servlet/*",这样就可以针对目录进行过滤。
- 以后缀名匹配,例如"*.jsp"
- 通配符,拦截所有web资源。"/*"
7.4 多个Filter的执行顺序
在我们的请求到达Servle之间是可以经过多个Filter的,一般来说,建议Filter之间不要有关联,各自处理各自的逻辑即可。这样,我们也无需关心执行顺序问题。
如果一定要确保执行顺序,就要对配置进行修改了,执行顺序如下
在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行
使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
- 1
- 2
- 3
总结:
1.了解Filter的概念,作用
2.Servlet和Filter的区别(相同点和不同点)
3.了解如何使用web.xml来创建Filter,不用掌握
4.掌握使用WebFilter注解的方式来创建Filter
5.掌握过滤拦截资源的4种方式中:/* /*.jsp /xxx.jsp即可,使用能够创建案例即可。
7.5 案例展示
7.5.1 字符集编码过滤器
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
7.5.2 登录过滤器
URI和URL:
我们目前只需要根据/后的路径来判断即可,不用关注于WEB服务器的路径,所以目前只用URI即可。
package com.aaa.filter;
import com.aaa.entity.User;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
/**
* Created by 张晨光 on 2020/4/24 16:04
* 过滤所有/*
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
//最简单的登录过滤的思路;
//复习:过滤器里面参数:ServletRequest
//HttpServletRequest:继承自ServletRequest
//利用两个增加的方法:getRequestURI() getRequestURL()
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.将ServletRequest转型为HttpServletRequest;
HttpServletRequest request= (HttpServletRequest) req;
//HttpServletResponse response= (HttpServletResponse) resp;
//2.获取地址栏的资源路径;
String uri = request.getRequestURI();
// StringBuffer url = request.getRequestURL();
//
// System.out.println(uri);
// System.out.println("url:"+url);
//3.判断一下资源路径是否是要登录的路径;
//如果/后是login.jsp或者是loginServlet都可以放行;
if(uri.contains("login.jsp")||uri.contains("loginServlet")){
//放行,就去下一个过滤器;
chain.doFilter(req,resp);
}else{
User user = (User) request.getSession().getAttribute("user");//一定要和loginServlet里面设置值的时候一致;
//上面的代码不转换也可以Object user=...
if(user!=null){ //就是已经登录了,继续放行;
chain.doFilter(req,resp);
}else{
//1.大家如果需要用resp作一下重定向,则需要在上面加代码;
// response.sendRedirect("login.jsp");
//2.如果不想写1种方法的实现,则可以使用
request.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。
原文链接:aaaedu.blog.csdn.net/article/details/105735302
- 点赞
- 收藏
- 关注作者
评论(0)