该博客主要记录在学习程序员Javaweb过程的一些笔记,方便复习以及加强记忆


文章目录

  • 前言
  • 一、拦截器
  • 1.1基础概念
  • 1.2 简单应用
  • 1.3 使用细节-过滤器链
  • 二、综合案例
  • 三、监听器



前言

学习了前面几章内容后,我们可以实现一个具有登录注册以及数据增删查改功能的小型网站,但是其中的问题还是不少的

比如,我们不直接访问 login.html 进行登录,直接访问 selectAll.jsp 也是可以访问的,那这样我们的登录注册功能岂不是没有作用?

下面,将来介绍一个新的方法去处理这些问题…`

一、拦截器

1.1基础概念

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_java


拦截器跟Servlet类似,也是一个类

我们可以设置一个拦截器,当我们直接访问数据资源时,会被拦截,之后自动跳转到登录界面去

同时,由于拦截器时是访问数据的并经之路,我们可以在上面完成一些统一操作,修改编码等…


1.2 简单应用

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_拦截器_02

这里注意!!! 实现接口之前一定要在pom.xml中导好Servlet的坐标,否则无法实现接口

当我们创建一个filter和hello.jsp后
开启tomcat,访问hello.jsp不会显示内容,因为访问被filter拦截了

Filter中设置即是拦截所有访问

@WebFilter("/*")

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_servlet_03

放行代码:

filterChain.doFilter(servletRequest, servletResponse);

放行前,我们在表单中获取的数据存在req域中,我们对其修改再放行(如修改编码等)
放行前reps是没有数据的,一般处理resp的数据是在放行后(放行后才有数据)才能进行处理


可以参考执行流程理解上面的话

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_java_04


设置拦截路径

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_数据_05

1.3 使用细节-过滤器链

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_java_06


在上图中,配置多个过滤器形成过滤器链,我们要注意运行的逻辑,运行顺序如下:
我们可以在idea中验证,只要每个过滤器放行代码前后使用输出语句输出数字,看访问资源时,看哪个数字先执行即可


黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_学习_07

二、综合案例

结合我们上一章节的代码,我们可以设置拦截器放置用户访问资源前没有登录

基本思想:我们判断用户是否登录的依据是【在登录时提交的的表单数据通过数据库查询是否存在来决定是否登录】我们之前查询的数据是放在user对象中,则我们判断user是为空,假如不为空,说明登录了,则我们放行,else不放行,并req中带上一个提示信息返回登录界面

代码如下:

HttpServletRequest req = (HttpServletRequest) request;//强转类型
		HttpSession session = req.getSession();
        Object user = session.getAttribute("user");

        if(user!=null)
        {
            //登录成功后放行
            chain.doFilter(request, response);
        }else{
            //跳转到未登录界面
            req.setAttribute("msg","您未登录");
            req.getRequestDispatcher("/login.jsp").forward(req,response);
        }

同时,我们的拦截器不能拦截所有信息,比如登录注册界面的图片等信息
如果访问的路径带有登录注册等的路径,就放行
所以我们还要加上如下代码:

//判断访问的资源是否与登录注册相关
        String[] urls = {"/login.jsp","/servletLogin","/register.jsp","/servletRegister","/checkServlet","/img"};
        String s = req.getRequestURI().toString();


        for(String u:urls)
        {
            if(s.contains(u))
            {
                chain.doFilter(request, response);
                return;//放行后就不用执行下面代码
            }
        }

三、监听器

黑马程序员mysql数据库原理设计与应用pdf 黑马程序员javaweb答案_数据_08


这部分内容会结合springbool的知识再作讲解