前言
这一节比较短,比较简单
1.概述
如果一些资源里面的代码都一样,那么就可以写在这个过滤器里面,因为请求都会经过这个过滤器的
还有就是我们前面写的代码,可以直接访问表,比如输入brand.jsp,但是这样理论是不行的,访问每一个资源都要判断一下,登录了没有,这种通用的操作,就可以放在过滤器里面,放在过滤器里面看用户是否登录了,访问一个资源,没有登录的话,就直接跳转到登录页面
统一编码也可以放在过滤器里面
2. 快速入门
@WebFilter的意思就是什么资源都会拦截
这个index.jsp是默认执行的
过滤器是Web的三大组件之一,所以我们一般在web下创建一个包
导第四个包
我们这里没有放行,就发现了,index.jsp没有显示出我们的效果了
说明过滤器被执行了,但是没有放行,就被拦在过滤器那里了
filterChain.doFilter(servletRequest, servletResponse);//这个就是我们这个方法的参数
现在就有了
3. 执行流程
3.1 Tomcat版本过高
但这里要在JavaScript中打印数据到控制台,Tomcat的版本必须要高才行,但我们这个编译器的插件只有7版本,所以不行,所以我们改用我们本地的Tomcat,在编辑配置里面增加这个资源的Tomcat,还有一点就是我们本地的Tomcat的版本是11,这个版本太高了,从Tomcat10版本开始,javax全部改为了javata,就是在导包的时候,包不对应,所以我们的Tomcat11就无法运行servlet,但还是可以运行jsp的
所以我们要把原来的pom.xml里面的javax.servlet给注释掉,用新的javata.servlet,然后全部导的javax包换成javata
这样我们在选择Filter的包的时候,就要选择import jakarta.servlet.*;这个包哦
这样以来,我们的Tomcat11就可以正常运行了,但是Tomcat7就不可以了
但没事的,用高版本的
可以参考这篇文章
3.2 继续
有这个我们可以看出,程序会把index默认的执行两遍
但还是这样的道理,放行前请求执行一次,放行后响应执行一次
//1.放行前,对Request数据进行处理,servletResponse里面没有数据//放行//放行后,servletResponse才有数据,对这个进行处理
4.使用细节
4.1 拦截路径的配置
@WebFilter("/hello.jsp")
这样写就意味着,只有访问hello.jsp,Filter才会生效
右键全部删除,就会清空控制台,前面两个是默认页面的执行,不用管
所以过滤器没有被执行
4.2 过滤器链
现在我们两个过滤器都配置为/*
这样的话,就会FilterDemo默认先执行,FilterDemo2后执行
所以FilterDemo会在FilterDemo2的前面,ASCII后面的就后执行
5.案例
因为所有资源访问的时候,都要去判断有没有登录,所以/*
登录与没有登录的区别,登录了就把用户对象放在session里面了
现在我们切换为原来的brand-demo
其实我们也有filter的模版
直接启用实时模版
在文件这里新建一个即可
记得把webFilter这里增加一下
HttpServletRequest req=(HttpServletRequest)request;//把request强转为HttpServletRequest//1.判断session里面有user这个键HttpSession session = req.getSession();Object user = session.getAttribute("user");//2.判断user是否为nullif(user!=null){//登陆过了//放行chain.doFilter(request, response);}else{//没有登陆,跳转到登录页面req.setAttribute("login_msg","您尚未登录!");req.getRequestDispatcher("/login.jsp").forward(req, response);//req与request用谁都可以}
这里为什么我们输入index.html但是显示的却是login的,为什么呢,因为浏览器有缓存
然后点删除数据,就没有了
图片就没有了!
为什么呢,因为图片这个css资源也被拦截了,这些资源的访问也需要用户登录了,才能访问,所以我们看到的是这个丑样子,如果没有输出缓存,就是好看的样子
如果在过滤器中,与登录相关的资源要放行,不能拦截,不然就很丑,然后就是没有账号,我们要注册,这个注册的资源也要放行掉
HttpServletRequest req=(HttpServletRequest)request;//把request强转为HttpServletRequest//判断访问资源路径是否和登录注册相关//@WebServlet("/loginServlet")下面写的路径就是这里的路径String[] urls={"/login.jsp","/imgs/","/css/","/loginServlet","register.jsp","/registerServlet","/checkCodeServlet"};//登录页面,图片,css,登录servlet,注册jsp,注册servlet,验证码//下面就要判断我们访问的路径是否包含上面数组的任何一项,包含的话,就应该放行//获取当前访问的资源路径String url = req.getRequestURL().toString();//循环判断for (String u : urls) {if(url.contains(u)){//找到了//放行chain.doFilter(request, response);return;//后面的代码就不用执行了,这个资源放行就放行了,放行了就不用干什么了}}
这样后面都可以正常执行了
6. Listener
这个用的不多
第一个类型的监听是application的
ServletContextListener代表整个Web应用,ServletContextListener一被创建,就代表Web应用创建成功了,,就可以做一些初始化动作
@WebListener
public class ContextLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//加载资源System.out.println("ContextLoaderListener...");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {//释放资源}
}
总结
下一节讲AJAX