JavaWeb第(3)部分:XML、Tomcat、Servlet、JSP、Cookie 和 Session、Filter过滤器

200 阅读10分钟

XML

##1.概述

image-20211015192423642

2.XML语法介绍

<?xml version="1.0" encoding="utf-8" ?>

<books>
    <book sn="SN131411">
        <name>时间简史</name>
        <author>霍金</author>
        <price>75</price>
    </book>

    <book sn="SN131412">
        <name>java</name>
        <author><![CDATA[
                    ,,,,<<<<<<<我搞
                   ]]></author>  <!--把括号里面的识别成文本-->
        <price>9.9</price>
    </book>
    <book sn="SN131413" name="吉利牌" author="哈哈哈" price="34"/>

</books>

3.XML解析技术

image-20211015200131902

4.Dom4j的使用和jar包入库

jar包导入和目录结构

image-20211015202148292

写入测试

image-20211015204559409

public void Test01() throws DocumentException {
    SAXReader saxReader = new SAXReader();
    Document read = saxReader.read("src/books.xml");
    System.out.println(read);
}
取值测试

image-20211015204449861

public void Test02() throws DocumentException {
        //读取books.xml文件
        SAXReader saxReader = new SAXReader();
         Document read = saxReader.read("src/books.xml");
        //通过   Document对象  使用  getRootElement  读取根元素
        Element rootElement = read.getRootElement();
        //通过根元素获取标签对象
        //elements 和 element 都是通过标签名查找子元素
        List<Element> elements = rootElement.elements("book");
        //遍历
        for (Element element : elements) {
//            asXML : 把标签对象转换成标签字符串
//            System.out.println(element.asXML());

//            通过name标签名获取元素对象
            String name = element.elementText("name");

//            同理
           String price = element.elementText("price");
           String author = element.elementText("author");

//           特殊的sn, attributeValue获取标签的属性值
            String sn = element.attributeValue("sn");

            System.out.println(new Book(sn,name,Float.valueOf(price),author));
        }
    }

Tomcat

1.JavaWeb概念

###1.请求和响应流程

image-20211015205500200

###2.Web资源的分类

image-20211015210226508

###3.常用的JavaWeb服务器

image-20211016141306651

###4.Tomcat服务器和Servlet版本的关系

image-20211016141701625

###5.目录介绍

image-20211016142248533

##2.JavaWeb使用

1.运行成功

要是想运行成功,就不能关闭Tomcat的启动程序

image-20211016143812221

image-20211016144742014

2.Tomcat端口号修改

image-20211016153020582

3.把Web部署到Tomcat中

image-20211016161248131

image-20211016162618838

4.手托页面和ip访问页面的区别

image-20211016163249985

5.Tomcat的默认访问

image-20211016163852917

6.idea整合Tomcat

image-20211016165234655

7.目录介绍

image-20211017195516209

image-20211017195533825

image-20211017195502108

8.导入jar包

一个一个添加然后一个一个的导入库

image-20211017195819755

或者

image-20211017200456268

image-20211017200612258

9.用idea启动web项目和配置

名称可以修改成项目名;
url是项目运行的默认地址

image-20211017201356002

image-20211017201934056

修改热部署:代码有变化时更新页面

image-20211017202107075

10.一些问题和修改

如图的 url 中的 servlet 是项目的名称 , 如果url不使用这样,那么看第二张图,的web下面的页面文件将无法加载和显示,因为路径名不正确,修改方式为第三张图:

image-20211019154031697

image-20211019154141513

先打开tomcat部署,打开部署,选择当前项目的启动工件(就是图片里蓝色的),如果不进行修改,那么默认的url访问路径就是这个一长串的工件名称,但是你的项目名不是这个,所以就要修改 , 那么就需要在:“应用程序上下文”那一框修改:成图中这样子。

image-20211019154303390

Servlet

1.Servlet的介绍

###1.什么是Servlet

image-20211017202938122

2.实现servlet程序

img

img

img

还有问题,在接下来还需要导入tomcat的lib库到该项目模块里面

image-20211019154748893

创建程序完成,接下来开始测试:

image-20211018155004601

测试类
package Hello;

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("终于找到你 !!!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
然后要在web.xml里面进行配置
<servlet>
        <!--类别名-->
        <servlet-name>HelloServlet</servlet-name>
        <!--全类名-->
        <servlet-class>Hello.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <!--对类别名的配置-->
        <servlet-name>HelloServlet</servlet-name>
        <!--工程路径下面的-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

image-20211018155242812

3.url如何定位到servlet程序进行访问

image-20211018160045236

4.servlet的生命周期

image-20211018160642504

image-20211018160513753

package Hello;

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {

    public HelloServlet() {
        System.out.println("1.构造");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.使用: 终于找到你 !!!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("4.销毁");
    }
}

5.Servlet整个类的继承体系

image-20211019210326538

image-20211019210345838

2.Servlet的使用

1.请求的分发处理

在java里请求都是大写的GET 和 POST

image-20211019153841260

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("3.使用: 终于找到你 !!!");

    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    String method = httpServletRequest.getMethod();
    System.out.println(method);
    if("GET".equals(method)){
        System.out.println("GET请求");
    }else if("POST".equals(method)){
        System.out.println("POST请求");
    }
}

2.通过继承HttpServlet实现程序

image-20211019195454644

image-20211019195722864

public class HttpHello extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get响应");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post响应");
    }
}

3.使用idea创建servlet程序

右键的新建里面就有Servlet,需要导入lib库,同时需要设置项目结构的facet页面下面的根源要勾上src。
idea生成的servlet会自动生成doget和dopost方法 以及在web.xml里自动配置

image-20211019200604908

image-20211019200448913

image-20211019200441042

##3.ServletConfig的使用

###1.使用

image-20211019211314338

public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("HelloServlet的别名是: "+servletConfig.getServletName());
    System.out.println("它的init-param: "+servletConfig.getInitParameter("username"));
    System.out.println(servletConfig.getServletContext());//打印对象
}

2.类的说明

image-20211019212740314

image-20211019213403295

如果重写了init方法,需要把super方法写上

image-20211019212712161

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    System.out.println("重写了init,然后还用super保证 父类的config的保存操作不会丢失");
}

4.ServletContext类

1.干什么的

image-20211019213917845

2.获取配置值和工程路径,存储数据

image-20211020192724936

image-20211020193714889

image-20211020192633452

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取context-param里面的值
        ServletContext context = getServletConfig().getServletContext();
        String namespace = context.getInitParameter("namespace");
        System.out.println("servletcontext的namespace:  "+namespace);
//        获取当前工程路径
        System.out.println("获取当前工程路径:  "+context.getContextPath());
        System.out.println("获取当前工程绝对路径:  "+context.getRealPath("/"));
    }
存储数据的展示

image-20211020194759926

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("下面是1的页面");
    
        ServletContext context = getServletContext();
    
        System.out.println("保存之前的:  "+context.getAttribute("key1"));
        context.setAttribute("key1","value1");
        System.out.println("保存之后的:  "+context.getAttribute("key1"));
        System.out.println("别的页面设置的context  :"+context.getAttribute("key2"));
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    ServletContext context = getServletContext();
    
    System.out.println("下面是2的页面");
    context.setAttribute("key2","value2");
    System.out.println("保存之后的:  "+context.getAttribute("key1"));
    System.out.println("别的页面设置的context  :"+context.getAttribute("key2"));

}

5.HTTP协议

image-20211020195040848

1.请求的HTTP协议的格式

image-20211020195616627

GET请求:

image-20211020195637285

image-20211020200106432

POST的请求

image-20211020201245223

image-20211020201255125

2.常用的请求头

image-20211020201428459

3.哪些是get请求,哪些是post

image-20211020201651213

4.响应的HTTP协议格式

image-20211020202303515

5.常见的响应码

image-20211020202555133

6.MIME类型说明

image-20211020202859290

6.HttpServletRequest类

image-20211020203921249

1.常用方法

image-20211020204127768

image-20211020204833766

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("获取请求的资源路径:  "+request.getRequestURI());
    System.out.println("获取请求资源的绝对路径  "+request.getRequestURL());
    System.out.println("获取客户端的ip地址  "+request.getRemoteHost());
    System.out.println("获取请求头   "+request.getHeader("Accept"));
    System.out.println("获取请求的方式   "+request.getMethod());
}

2.获取客户端发来的请求参数

image-20211020211447227

image-20211020211456451

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String[] hobby = request.getParameterValues("hobby");

    System.out.println("用户名:"+username);
    System.out.println("密码:"+password);
    System.out.println("爱好:"+ Arrays.asList(hobby));
}

3.POST请求的中文乱码问题

image-20211021143030445

解决:

image-20211021143436283

private void hh(HttpServletRequest request) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String[] hobby = request.getParameterValues("hobby");

    System.out.println("用户名:"+username);
    System.out.println("密码:"+password);
    System.out.println("爱好:"+ Arrays.asList(hobby));
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8"); //解决方法,设置成UTF-8
    System.out.println("------------post--------");
    
    hh(req);
}

4.请求的转发

image-20211021145929636

image-20211021151514293

image-20211021152046934

Servlet1
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        查看材料
        String username = request.getParameter("username");
        System.out.println("Servlet1的查看材料 :"+username);

//        给材料盖章
        request.setAttribute("key1","1好了");

//        问路:Servlet2怎么走
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");


//        开始走路
        requestDispatcher.forward(request,response);

    }
Servlet2
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        查看材料
        String username = request.getParameter("username");
        System.out.println("Servlet2的查看材料 :"+username);

//        查看servlet1的章
        Object key1 = request.getAttribute("key1");
        System.out.println("Servlet1是否盖章:  "+key1);


//        实现自己的业务
        System.out.println("实现Servlet2的业务,再见");
    }

5.base标签的作用

image-20211021153333769

image-20211021153351461

6.Web中的路径问题

image-20211021153526633

7.Web中“/”的意义

image-20211021153958703

##7.HttpServletResponse类

image-20211021154301043

1.两个输出流的说明

image-20211021154715636

image-20211021155411548

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        往客户端返回字符串

        PrintWriter writer = response.getWriter();
        writer.write("return something!!!");
    }

2.中文乱码问题(一)

image-20211021160606071

修改:
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        往客户端返回字符串

        response.setCharacterEncoding("UTF-8");
//        通过响应头来修改浏览器也是用UTF-8
        response.setHeader("Content-Type","text/html;charset-UTF-8");
        PrintWriter writer = response.getWriter();
        writer.write("你好啊你好啊");
        writer.write("return something");
    }

image-20211021160952616

页面源代码查看,已看到响应头属性改变

image-20211021161114241

3.乱码解决方案(二)

image-20211021163914966

4.请求重定向

image-20211021165006323

image-20211021170014534

image-20211021170232163

response1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("曾到此一游----response1");

        //设置响应状态302(重新定向)
        response.setStatus(302);

//        设置响应头,声明新地址在哪
        response.setHeader("Location","http://localhost:8080/servlet/response2");
    }
response2
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("response2 run!!!");
    }

5.请求重定向(二)

image-20211021170515207

JSP

1.什么是JSP

image-20211025143444670

image-20211025143324442

模仿servlet传递页面数据的过程
public class PringHtml extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        模仿servlet传递页面数据的过程
//        通过响应流回传html页面数据
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();

        writer.write("<!DOCTYPE html>\r\n");
        writer.write("<html lang=\"en\">\n");
        writer.write("<head>\n");
        writer.write("<meta charset=\"UTF-8\">\n");
        writer.write(" <title>Title</title>\n");
        writer.write("</head>\n");
        writer.write("<body>\n");
        writer.write("这是html页面\n");
        writer.write("</body>\n");
        writer.write("</html>\n");
    }
}
JSP传输

image-20211025144234893

image-20211025144209543

创建和访问

image-20211025144337581

##2.JSP页面的本质

本质上是Servlet程序:
在页面加载时,服务器资源文件下就会出现对应的java程序

image-20211025150809968

image-20211025151431642

image-20211025151500329

3.JSP的三种语法

1.page指令

image-20211025153037755

image-20211025153123004

image-20211025153138914

2.脚本

声明脚本

image-20211025153324659

image-20211025153831711

####表达式脚本

image-20211026102736792

image-20211026102817062

image-20211026102754182

代码脚本

与页面语句混合使用 : 非常灵活

image-20211026105651365

源代码

image-20211026105808953

##4.JSP的三种注释

image-20211026110032534

image-20211026110254790

image-20211026110328399

##5.JSP九大内置对象

image-20211026110558765

image-20211026110614518

image-20211026110802674

6.四大域对象

image-20211026113453244

scope
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>scope.jsp页面</h1>
    <%
        //往四个域分别保存数据
        pageContext.setAttribute("key","pageContext");
        request.setAttribute("key","request");
        session.setAttribute("key","session");
        application.setAttribute("key","application");
    %>
    pageContext是否有值: <%=pageContext.getAttribute("key")%><br>
    request 是否有值:<%=request.getAttribute("key")%><br>
    session是否有值:<%=session.getAttribute("key")%><br>
    application是否有值;<%=application.getAttribute("key")%><br>

<%
    request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>
scope2
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>scope2.jsp页面</h1>

pageContext是否有值: <%=pageContext.getAttribute("key")%><br>
request 是否有值:<%=request.getAttribute("key")%><br>
session是否有值:<%=session.getAttribute("key")%><br>
application是否有值;<%=application.getAttribute("key")%><br>
</body>
</html>

image-20211026113509765

7.JSP中的out和response的getWriter区别

image-20211026184953124

image-20211026185003707

<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        out.write("out1输出\r\n");
        out.flush();
        out.write("out2输出\r\n");

        response.getWriter().write("response1输出\r\n");
        response.getWriter().write("response2输出\r\n");

    %>
</body>
</html>

image-20211026185407208

问题:write里面只能写字符串,如果写了int类型的,则会输出乱码或者空白。。。不会输出数字

print可以输出任意的数据类型

image-20211026190323664

##8.JSP的常用标签

1.静态包含

image-20211026191312710

image-20211026191318875

image-20211026191331841

2.动态包含

主页面
<html>
<head>
    <title>Title</title>
</head>
<body>
头部信息<br>
主体信息<br>
<%@include file="front.jsp"%>

<jsp:include page="front.jsp">
    <jsp:param name="key" value="abc"/>
    <jsp:param name="password" value="12233456"/>
</jsp:include>
</body>
</html>
底部页面
<html>
<head>
    <title>Title</title>
</head>
<body>
<br>
底部信息<br>
修改底部<br>
获取从主页面创建的数值 :<%=request.getParameter("password")%>
</body>
</html>

image-20211026192907364

底层原理

image-20211026193037462

image-20211026192953215

image-20211026193003946

image-20211026193012519

3.转发

image-20211026193259984

9.请求转发

image-20211026195217591

image-20211026195232633

代码演示

image-20211026195518270

jsp代码

image-20211026195803341

#Listener监听器

image-20211026201103459

主要使用的
image-20211026202105249
public class Listener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("创建成功");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("销毁成功");
    }
    
}

image-20211026202610290

Cookie 和 Session

Cookie

1.什么是Cookie

image-20211103201722846

2.Cookie的创建

public class CookieServlet extends BaseServlet {


    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 创建Cookie对象
        Cookie cookie = new Cookie("key4", "value4");
        //2 通知客户端保存Cookie
        resp.addCookie(cookie);
        //1 创建Cookie对象
        Cookie cookie1 = new Cookie("key5", "value5");
        //2 通知客户端保存Cookie
        resp.addCookie(cookie1);

        resp.getWriter().write("Cookie创建成功");
    }
}

image-20211104144007876

image-20211104144357447

3.服务器如何获取Cookie

image-20211104145119346

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        resp.getWriter().write(cookie.getName()+" "+cookie.getValue()+"<br>");
    }
}

image-20211104145346763

遍历查找需要的Cookie,所以说要创建一个Utils工具类
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie[] cookies = req.getCookies();
    Cookie cookie = cookieUtils.findCookie("key4", cookies);
    if (cookie!=null){
        resp.getWriter().write(cookie.getName()+" "+cookie.getValue());
    }
}
public Cookie findCookie(String name , Cookie[] cookies){
    if(name==null||cookies==null||cookies.length==0)return null;

    for (Cookie cookie : cookies) {
        if (name.equals(cookie.getName())){
            return cookie;
        }
    }
    return null;
}

4.Cookie值的修改

image-20211104150841269

方案1:
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1 创建Cookie对象
    Cookie cookie = new Cookie("key4", "newValue4");
    //2 通知客户端保存Cookie
    resp.addCookie(cookie);

    resp.getWriter().write("Cookie修改成功");
}
方案2:
Cookie[] cookies = req.getCookies();
Cookie cookie = cookieUtils.findCookie("key4", cookies);
if (cookie!=null){
    cookie.setValue("new2Value4");
    resp.addCookie(cookie);
}

5.Cookie的生命控制

protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie  cookie = new Cookie("defaultLift","defaultLift");

    /*
     * 设置存活时间:
     * 负数:默认值,服务器关了就删除
     * 0:立刻删除
     * 其他:单位秒
     *
     * */
    cookie.setMaxAge(4);

    resp.addCookie(cookie);
}

6.Cookie的有效路径设置

image-20211104153556211

image-20211104154207103

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie = new Cookie("Path1","Path1");
    cookie.setPath(req.getContextPath());
    resp.addCookie(cookie);
    resp.getWriter().write("创建了一个带有Path路径的cookie");
}

7.练习1:免用户登录

image-20211104155447786

public class LoginServlet extends BaseServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if("admin".equals(username)&&"123456".equals(password)){
            System.out.println("登录成功");
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60);
            resp.addCookie(cookie);
        }else {
            System.out.println("登陆失败");
        }
    }

}
第一次登录:

image-20211104160817920

再次登录:

image-20211104160901117

Session

1.Session会话

image-20211104161242911

2.Session的创建和获取

image-20211104163013231

image-20211104162333798

public class SessionServlet extends BaseServlet{

    protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建和获取session对象
        HttpSession session = req.getSession();
//        判断是不是第一次
        boolean isNew = session.isNew();
//        获取信息
        String id = session.getId();

        resp.getWriter().write("session的ID是:"+id+"<br>");
        resp.getWriter().write("是不是第一次创建的: "+isNew);
    }
}

3.Session域的数据存取

image-20211104162906965

protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().setAttribute("key1","value1");
}

protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Object key1 = req.getSession().getAttribute("key1");
    resp.getWriter().write("从key1中获取的数据:"+key1.toString());
}

###4.Session的生命周期控制

image-20211104164352321

image-20211104163803232

<!--    可以修改所有的session的默认超时时常都是20分钟-->
    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

image-20211104163942157

三秒超时
超时后就会清除session
在3秒内无法创建
3秒后就可以创建新的session了
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession();
    session.setMaxInactiveInterval(3);
    int maxInactiveInterval =session.getMaxInactiveInterval();
    resp.getWriter().write("现在设置后的Session的潮湿时常: "+maxInactiveInterval+"秒<br>");
}

image-20211104164333285

5.浏览器和Session关联的技术内幕

image-20211104165857964

客户端

image-20211104165920302

中间操作

image-20211104165937958

服务器

image-20211104165954205

Filter过滤器

1.什么是Filter

image-20211110104313437

2.初体验(权限检查)

    拦截流程,首先设置所以admin路径下的页面都拦截 : 就是说当用户访问admin下的任意页面,都需要跳转到后台的Filter程序,该程序检测session域中用户是否存在,存在就放行,否则就跳转到登录页面实现用户登陆 
如果没有登陆,就跳转到登陆页面

image-20211110105723459

image-20211110105715402

拦截的实现

image-20211110110841143

package Filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        if(user == null){
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;
        }else{
            filterChain.doFilter(servletRequest,servletResponse);//放行
        }
    }

    @Override
    public void destroy() {

    }
}
Web.xml配置拦截路径
 <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>Filter.AdminFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
<!--        配置拦截路径   http://ip:port/工程路径/-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
调试

image-20211110111904347

3.Filter的生命周期

image-20211110153212379

4.FilterConfig类

image-20211110153638375

5.FilterChain过滤器链

image-20211113101019831

image-20211113101710459

image-20211113102051372

image-20211113102343298

Filter1
public class Filter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter1前置");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Filter1后置");
    }

    @Override
    public void destroy() {

    }
}
Filter2
public class Filter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter2前置");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Filter2后置");
    }

    @Override
    public void destroy() {

    }
}
xml
<filter>
        <filter-name>Filter1</filter-name>
        <filter-class>Filter.Filter1</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/hh.jsp</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>Filter2</filter-name>
        <filter-class>Filter.Filter2</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Filter2</filter-name>
        <url-pattern>/hh.jsp</url-pattern>
    </filter-mapping>

6.Filter拦截器的三种拦截路径

image-20211113102713332

image-20211113102733403