一、什么是过滤器
Filter过滤器是JavaWeb中三大组件之一(三大组件:Servlet程序、Filter过滤器、listener监听器)
Filter是javaEE的规范,也就是接口
二、过滤器的作用
拦截请求,过滤响应:
解释:过滤器可以把请求的资源拦截下来,在拦截过程中加上一些代码、功能实现一些特殊的功能
说明:过滤器在访问每一个资源的时候都会被执行,我们可以在过滤器中加上一些拦截性的操作
过滤器拦截请求常见的应用场景:
- 权限检查
- 日志操作
- 事务处理
- 统一编码处理
- 敏感数据拦截
三、Filter过滤器的使用
1.Filter的访问
-
xml配置
<web-app> ... <filter> <!-- 为filter起别名--> <filter-name>FilterTest</filter-name> <!-- 具体过滤器的全类名--> <filter-class>com.filter.FilterTest</filter-class> </filter> <filter-mapping> <!-- 访问某个路径时调用哪个filter--> <filter-name>FilterTest</filter-name> <!-- 什么路径可以访问到filter--> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
-
注解
//什么路径可以访问该filter @WebFilter("/*")
2.Filter的使用步骤
- 新建类实现Filter接口
- 根据需要重写Filter接口的方法(必须重写doFilter,也就是过滤器功能的方法)
- 在doFilter方法中定义相关的逻辑(记得判断并放行)
//执行方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//放行
chain.doFilter(request, response);
}
3. 生命周期
- 构造方法 -|
基本一起,在web工程启动后创建对象,然后初始化
- init()------初始化 -|
- doFilter()--执行 每次只要有请求都会拦截并执行
- destory()---销毁 停止web工程时自动销毁
4.Filter的拦截路径
拦截路径表示filter对哪些请求进行拦截(访问所有资源,都会被拦截)
-
拦截jsp
@WebFilter("*.jsp")
-
拦截某一个目录下
@WebFilter("/a/*")
-
拦截某一个路径
@WebFilter("/index.jsp")
-
放行资源、路径
//将ServletRequest转换成HttpServletRequest子对象 HttpServletRequest httpServletRequest = (HttpServletRequest) request; //放行资源\路径 String[] paths = {"/imgs/", "/css/", "/js/", "/login.jsp", "/loginServlet", "/register.jsp", "/enrollServlet"}; //获取当前路径 String url = httpServletRequest.getRequestURL().toString(); //比对路径 for (String str : paths) { //判断路径中是否存在放行的资源\路径 if (url.contains(str)) { //放行 chain.doFilter(request, response); } }
四、过滤器链
Filter过滤器链是指在 Web 应用中,部署了多个 Filter 来拦截同一目标资源的情况;Filter 链中的 Filter 的执行顺序由 <filter-mapping> 标签的配置顺序决定(A-Z)
Filter 链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源
五、处理网页编码
//将ServletRequest转换成HttpServletRequest子对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//将ServletResponse转换成HttpServletResponse子对象
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
//设置页面请求的编码
httpServletRequest.setCharacterEncoding("utf-8");
//设置服务器响应的编码
httpServletResponse.setContentType("text/html;charset=utf-8");
//放行
chain.doFilter(request, response);
标签:HttpServletRequest,路径,Filter,doFilter,过滤器,拦截
From: https://www.cnblogs.com/ynxiyan/p/17147527.html