Filter
Posted 超霸霸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter相关的知识,希望对你有一定的参考价值。
Filter
一、概念
- web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
- 过滤器的作用:一般用于完成通用的操作:登录验证、统一编码处理、敏感字符过滤…
二、快速入门
-
步骤:
- 定义一个类,实现Filter
- 复写方法
- 配置拦截路径
- web.xml
- 注解
package cn.chao.web.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class filterDemo1 implements Filter @Override public void init(FilterConfig filterConfig) throws ServletException Filter.super.init(filterConfig); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException System.out.println("filterDemo1被执行了...."); //放行 filterChain.doFilter(servletRequest,servletResponse); @Override public void destroy() Filter.super.destroy();
-
web.xml配置
<filter> <filter-name>demo1</filter-name> <filter-class>cn.chao.web.filter.filterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping>
-
过滤器执行流程
- 执行过滤器
- 执行放回后的资源
- 回来执行过滤器放行代码下面的代码
-
过滤器生命周期方法
init
:在服务器启动后会创建Filter方法,然后调用init方法。只执行一次,用于加载资源doFilter
:每一次请求被拦截资源时,会执行,执行多次destroy
:在服务器关闭后,Filter对象被摧毁。如果服务器正常关闭则会执行destroy方法,只执行一次,用于释放资源
-
过滤器配置详解
- 拦截路径配置
- 具体资源路径:
/index.jsp
,只有访问index.jsp资源时过滤器才被执行 - 拦截目录:
/user/*
,访问/user下的所有资源时,过滤器都会被执行 - 后缀名拦截:
*.jsp
,访问所有后缀名为jsp的资源时,过滤器都会被执行 - 拦截所有资源:
/*
,访问所有资源时,过滤器都会被执行
- 具体资源路径:
- 拦截方式配置
- 注解配置:设置dispatcherTypes属性
- REQUEST:默认值,浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- web.xml配置:设置
<dispatcher></dispatcher>
标签即可
- 注解配置:设置dispatcherTypes属性
- 拦截路径配置
-
过滤器链(配置多个过滤器)
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
- 先后顺序:
- 注解配置:按照类名的字符串比较规则比较,值小的先执行
- web.xml配置:
<filter-mapping>
谁定义在上边就先执行
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
三、登录验证
- 访问资源,验证其是否登录
- 如果登录了,则可直接放行
- 如果没有登录,则跳转到登录页面,提示未登录信息
package cn.chao.web.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class filterCase1 implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
Filter.super.init(filterConfig);
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
//0.强制转换
HttpServletRequest request=(HttpServletRequest) servletRequest;
//1.获取资源请求路径
String uri=request.getRequestURI();
//2.判断是否包含登录相关资源路径,要注意排除css/js/图片/验证码等资源
if(uri.contains("/login.jsp")||uri.contains("/loginServlet")||uri.contains("/css/")||uri.contains("/js/")||uri.contains("/checkcodeServlet"))
//包含,用户想登录,放行
filterChain.doFilter(servletRequest,servletResponse);
else
//不包含,需要验证用户是否登录
Object user = request.getSession().getAttribute("user");
if(user!=null)
//登录了,放行
filterChain.doFilter(servletRequest,servletResponse);
else
//没有登录,跳转到登录页面
request.setAttribute("login_msg","尚未登录,请登录");
request.getRequestDispatcher("login.jsp").forward(request,servletResponse);
@Override
public void destroy()
Filter.super.destroy();
以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章