【JavaWeb】过滤器Filter
1、概念
过滤器可以拦截到指定的请求,对该请求拦截后可以进行对请求和响应进行操作,然后放行,可以自己去寻找对应的servlet或者其他过滤器。
使用的业务场景:
用户在客户端发送请求----> 拦截验证:是否为登陆的状态(session),如果是放行,不是的话跳转登陆。
定义:
servlet定义的一个web组件,用来拦截servlet请求,以便获取请求中的资源的参数,过滤的对象主要是客户端请求的web资源。
优点:
热插拔,随时用,随时也可以去掉,不会影响代码的执行。
使用:
1、书写一个类实现Filter接口。 2、重写接口的三个方法,分别是初始化,执行连接,销毁 3、配置注解@WebFilter,将需要过滤的页面的请求地址写入注解(也可以在web.xml中配置)
2、案例
// 拦截全部的请求
@WebFilter("/*")
public class CheckLoginFilter implements Filter {
// 初始化过滤器,一般用来初始化一些参数
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化一些参数 encoding = utf-8;
}
// 过滤器执行业务的方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 转化对象,方便操作
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 做业务
request.setCharacterEncoding("utf-8");
// 验证是否登陆过:判断当前会话中是否包含user对象
HttpSession session = request.getSession();
// 获得当前对象
Object user = session.getAttribute("user");
// !!!要排除一些默认页面
// 获取所有的请求资源
String path = request.getRequestURI();
// 判断path是否包含index.jsp
if (path.contains("login.jsp")||path.contains("login")){
filterChain.doFilter(request,response);
}else{
// user为空,对象没有绑定,没有登陆
if (user == null) {
response.sendRedirect("login.jsp");
} else {
// 可以用转发给下一个页面,但是太麻烦 不能转发给下一个过滤器,系统提供了filterChain
// 直接使用filterChain的doFilter方法,自动去找寻,如果还有下一个过滤器,直接跳转下一个过滤器
// 如果没有过滤器,会直接跳转对应的servlet,处理业务
filterChain.doFilter(request,response);
}
}
}
@Override
public void destroy() {
System.out.println("我被销毁了");
}
}