Filter
Filter执行流程
放行前对request做处理,放行后对response做处理。
Filter拦截路径配置
过滤器链
·注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序。
案例
登录验证
代码如下:
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Description: TODO
* @author: scott
* @date: 2022年03月03日 14:46
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req =(HttpServletRequest) servletRequest;
//判断访问的资源路径是否和登录有关注册有关
String [] urls ={"/login.jsp","/imgs/","/css/","/loginServlet","register.jsp","registerServlet"};
//获取当前访问的资源路径
String url = req.getRequestURL().toString();
for (String s : urls) {
if(url.contains(s)){
//找到,放行
filterChain.doFilter(servletRequest,servletResponse);
return;
}
}
//判断Session中是否有user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//判断user是否为null;
if(user!=null){
//登录过
//放行
filterChain.doFilter(servletRequest,servletResponse);
}else{
//未登录,存储提示信息,跳转至登录页面
req.setAttribute("login_msg","您尚未登录");
req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);
}
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
Listener
ServletContextListener使用
代码如下:
package com.itheima.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* @Description: TODO
* @author: scott
* @date: 2022年03月03日 15:54
*/
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//加载资源
System.out.println("ContextLoaderListener!");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}