Web学习笔记8-【过滤器Filter:功能、使用方法、生命周期、使用场景,文件的上传,文件的下载】

十九、过滤器 Filter

1. 过滤器的功能

(1)⽤来拦截传⼊的请求和传出的响应。
(2)修改或者以某种⽅式处理数据流,该数据流是正在客户端和服务端之间交换

2. 过滤器的使用方法

与使⽤ Servlet接口 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝即可。

3. 过滤器的注意事项

(1)可以加多个过滤器,多个过滤器之间有先后顺序
(2)当客户端请求被过滤器拦截,会在过滤器内暂停进行处理,但是不会自动传入服务端。要接着走下一步,需要调用FilterChain中的dofilter方法。

filterChain.doFilter(servletRequest,servletResponse);

(3)实现Filter接口,最多可以只实现一个方法,doFilter方法。

4. 过滤器的生命周期

(1)当 Tomcat 启动时,通过反射机制调⽤ Filter 的⽆参构造函数创建实例化对象,同时调⽤ init ⽅法实现初始化,doFilter ⽅法调⽤多次,当Tomcat 服务关闭的时候,调⽤ destory 来销毁 Filter 对象。
(2)⽆参构造函数:只调⽤⼀次,当 Tomcat 启动时调⽤(Filter ⼀定要进⾏配置)
(3)init ⽅法:只调⽤⼀次,当 Filter 的实例化对象创建完成之后调⽤
(4)doFilter:调⽤多次,访问 Filter 的业务逻辑都写在 Filter 中
(5)destory:只调⽤⼀次,Tomcat 关闭时调⽤。
(6)同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调⽤,因为 web.xml 是从上到下顺序读取的。

<filter>
 <filter-name>my</filter-name>
 <filter-class>com.southwind.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>my</filter-name>
 <url-pattern>/login</url-pattern>
</filter-mapping>
<filter>
 <filter-name>charcater</filter-name>
 <filter-class>com.southwind.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>charcater</filter-name>
 <url-pattern>/login</url-pattern>
 <url-pattern>/test</url-pattern>
</filter-mapping>

(7)也可以通过注解的⽅式来简化 web.xml 中的配置

<filter>
 <filter-name>my</filter-name>
 <filter-class>com.southwind.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>my</filter-name>
 <url-pattern>/login</url-pattern>
</filter-mapping>

等于

@WebFilter("/login")
public class MyFilter implements Filter {
}

5. 过滤器实际使用场景

(1)统⼀处理中⽂乱码
(2)屏蔽敏感词
(3)控制资源的访问权限。

6. 使用示例

(1)简单的客户端请求页面

在这里插入图片描述

(2)过滤器

在这里插入图片描述

(3)web.xml中过滤器的配置

在这里插入图片描述

(4)需要处理的servlet

在这里插入图片描述

二十、文件的上传

1. JSP的配置

(1)input 的 type 设置为 file
(2)form 表单的 method 设置 post,get 请求会将⽂件名传给服务端,⽽不是⽂件本身
(3)form 表单的 enctype 设置 multipart/form-data,以⼆进制的形式传输数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>Title</title>
</head>
<body>
 <form enctype="multipart/form-data" action="/upload" method="post">
 <input name="desc" type="text"/><br/>
 <input name="text" type="file"/><br/>
 <input type="submit" value="上传"/>
 </form>
</body>
</html>

2. Servlet的配置

fileupload 组件可以将所有的请求信息都解析成 FileIteam 对象,可以通过对 FileItem 对象的操作完成上传,⾯向对象的思想。注意图片以字节流上传。

3. 引入jar包

在这里插入图片描述

package com.southwind.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
// //通过输⼊流获取客户端传来的数据流
// InputStream inputStream = req.getInputStream();
// Reader reader = new InputStreamReader(inputStream);
// BufferedReader bufferedReader = new BufferedReader(reader);
// //通过输出流将数据流输出到本地硬盘
// //获取⽂件夹的绝对路径
// String path = req.getServletContext().getRealPath("file/copy.txt");
// OutputStream outputStream = new FileOutputStream(path);
// Writer writer = new OutputStreamWriter(outputStream);
// BufferedWriter bufferedWriter = new BufferedWriter(writer);
// String str = "";
// while((str = bufferedReader.readLine())!=null){
// System.out.println(str);
// bufferedWriter.write(str);
// }
// bufferedWriter.close();
// writer.close();
// outputStream.close();
// bufferedReader.close();
// reader.close();
// inputStream.close();
        try {
            DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new
                    ServletFileUpload(fileItemFactory);
            List<FileItem> list = servletFileUpload.parseRequest(req);
            for(FileItem fileItem : list){
                if(fileItem.isFormField()){
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name+":"+value);
                }else{
                    String fileName = fileItem.getName();
                    long size = fileItem.getSize();
                    System.out.println(fileName+":"+size+"Byte");
                    InputStream inputStream = fileItem.getInputStream();
// Reader reader = new InputStreamReader(inputStream);
// BufferedReader bufferedReader = new
                    BufferedReader(reader);
                    String path =
                            req.getServletContext().getRealPath("file/"+fileName);
                    OutputStream outputStream = new FileOutputStream(path);
// Writer writer = new OutputStreamWriter(outputStream);
// BufferedWriter bufferedWriter = new
                    BufferedWriter(writer);
                    int temp = 0;
                    while((temp = inputStream.read())!=-1){
                        outputStream.write(temp);
                    }
// bufferedWriter.close();
// writer.close();
                    outputStream.close();
// bufferedReader.close();
// reader.close();
                    inputStream.close();
                    System.out.println("上传成功");
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

二十一、文件的下载

1. jsp的配置

在这里插入图片描述
在这里插入图片描述

2. servlet配置

在这里插入图片描述

笔记部分来自韩顺平老师

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在JWS SOAP Web Service,可以使用Handler实现过滤器/拦截器的效果,对接口请求和响应进行处理。 Handler是Java EE的一个标准接口,用于处理Web Service请求和响应。在JWS SOAP Web Service,Handler可以对请求和响应进行处理,类似于Servlet过滤器和拦截器。 Handler可以在请求到达Web Service之前或者响应离开Web Service之后进行处理,可以对SOAP消息的头和体进行处理,可以修改SOAP消息的内容,可以设置SOAP消息的属性等。 在JWS SOAP Web Service使用Handler需要完成以下步骤: 1. 创建Handler类,实现javax.xml.ws.handler.Handler接口,并实现其方法。 2. 在Web Service实现类使用@HandlerChain注解指定Handler链的位置和名称。 3. 在Handler链的配置文件,指定Handler类的位置和名称,并指定Handler类的处理顺序。 示例代码如下: Handler类: ```java public class MyHandler implements SOAPHandler<SOAPMessageContext> { public boolean handleMessage(SOAPMessageContext context) { Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outbound) { System.out.println("Handle outbound message."); } else { System.out.println("Handle inbound message."); } return true; } public boolean handleFault(SOAPMessageContext context) { System.out.println("Handle message fault."); return true; } public void close(MessageContext context) { System.out.println("Close handler."); } public Set<QName> getHeaders() { return null; } } ``` Web Service实现类: ```java @WebService @HandlerChain(file = "handler-chain.xml") public class MyWebService { @WebMethod public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` Handler链配置文件handler-chain.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/handler-chains_1_0.xsd"> <handler-chain> <handler> <handler-class>com.example.MyHandler</handler-class> </handler> </handler-chain> </handler-chains> ``` 在上面的示例,我们创建了一个MyHandler类,实现了javax.xml.ws.handler.Handler接口,并实现了handleMessage、handleFault、close和getHeaders方法。在MyWebService类使用@HandlerChain注解指定了Handler链的位置和名称。在handler-chain.xml,指定了MyHandler类的位置和名称,并指定了处理顺序。 当Web Service被调用时,MyHandler类会对请求和响应进行处理,并输出相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃凉拌辣芒果

不断学习,不断进步,共勉~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值