Java Web 学习笔记

Wesley13
• 阅读 641

过滤器

Filter

功能:

1、用来拦截传入的请求和传出的相应。

2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。

如何使用?

与使用Servlet类似,Filter是JavaWeb提供的一个借口,开发者只需要自定义一个类并且实现该接口即可

package com.janeroad.filter;

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

public class CharacterFilter implements Filter { [@Override](https://my.oschina.net/u/1162528) public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); filterChain.doFilter(servletRequest,servletResponse); } } 

web.xml中配置Filter

<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> 

注意:doFilter方法中处理完业务逻辑之后,必须添加 filterChain.doFilter(servletRequest,servletResponse);

否则请求/相应无法向后传递,一直停留在过滤器中。

Filter的生命周期

当Tomcat启动时,通过反射机制调用Filter的无参构造函数创建实例化对象,同时调用init方法实现初始化,doFilter 方法调用多次,当Tomcat服务关闭的时候,调用destory来销毁Filter对象

无参构造函数:只调用一次,当Tomcat启动时调用(Filter一定要进行配置)

init方法:只调用一次,当Filter的实例化对象创建完成之后调用

doFilter:调用多次,访问Filter的业务逻辑都写在Filter中

destory:只调用一次,Tomcat关闭时调用

同时配置多个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> 

1、MyFilter

2、CharacterFilter

也可以通过注解的方式来简化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 { } 

实际开发中Filter的使用场景:

1、统一处理中文乱码

2、屏蔽敏感词

package com.southwind.filter;

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

@WebFilter("/test") public class WordFilter implements Filter { [@Override](https://my.oschina.net/u/1162528) public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("UTF-8"); //将"敏感词"替换成*** String name = servletRequest.getParameter("name"); name = name.replaceAll("敏感词","***"); servletRequest.setAttribute("name",name); filterChain.doFilter(servletRequest,servletResponse); } } 

import javax.servlet.ServletException;
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.IOException; @WebServlet("/test") public class TestServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = (String) req.getAttribute("name"); System.out.println("servlet:"+name); } } 

3、控制资源的访问权限

package com.southwind.filter;
import javax.servlet.*; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebFilter("/download.jsp") public class DownloadFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); String name = (String) session.getAttribute("name"); if(name == null){ //不是登录状态 response.sendRedirect("/login.jsp"); }else{ filterChain.doFilter(servletRequest,servletResponse); } } } 

文件上传下载

  • 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> 
  • Servlet

fileupload组件可以将所有的请求信息都解析成FileItem对象,可以通过FileItem对象的操作完成上传,面向对象的思想

package com.janeroad.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 { 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(); String path = req.getServletContext().getRealPath("file/"+fileName); OutputStream outputStream = new FileOutputStream(path); int temp = 0; while((temp = inputStream.read())!=-1){ outputStream.write(temp); } outputStream.close(); inputStream.close(); System.out.println("上传成功"); } } } catch (FileUploadException e) { e.printStackTrace(); } } } 

 来源: 真相只有一个

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java web 开发入门
Javaweb,是java技术用来解决web互联网领域的技术总和。Javaweb技术主要包括客户端和服务端,java在客户端的服务有javaapplet,不过用的非常少,大部分应用在服务端,比如Servlet,JSP和第三方框架等。Web就是网页的意思,它表示Internet上主机提供的可供访问的资源。Web资源主要分为静态web资源和动态web
Wesley13 Wesley13
3年前
java ee 部分分析
1logfilteranalysis分析filter:与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查
Wesley13 Wesley13
3年前
SSH基础的面试题1
1.简述struts2的执行流程!(http://static.oschina.net/uploads/space/2016/0311/155522_1MzX_2646795.jpg)1)客户端初始化一个指向Servlet容器请求;2)这个请求经过一系列的过滤器(Filter)3)接着Filter
Stella981 Stella981
3年前
Servlet的Filter的使用
    Filter可认为是Servlet的“加强版”,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成相应,这一点与Servlet相同,但实际上很少会这样使用。使用Filter的完整流程是:Filter对用户的请求进行预处理,接着将请求交给Servlet进行处理并响应
Stella981 Stella981
3年前
SpringBoot学习之路:09.Spring Boot中添加Filter应用
   上篇文章中说了SpringBoot中是如何使用servlet的,本文将讲解在SpringBoot中对过滤器Filter的实现一.编写MyFilter实现Filter接口packagecom.maxbill.core.webbox.filter;importorg.apache.log4j
Stella981 Stella981
3年前
Eclipse搭建springboot项目(八)拦截器、过滤器、监听器
知识点:1、SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter(核心知识)  filter简单理解:人检票员(filter)景点  1)SpringBoot启动默认加载的Filter    characterEncodingFilter    
Easter79 Easter79
3年前
SpringBoot学习之路:09.Spring Boot中添加Filter应用
   上篇文章中说了SpringBoot中是如何使用servlet的,本文将讲解在SpringBoot中对过滤器Filter的实现一.编写MyFilter实现Filter接口packagecom.maxbill.core.webbox.filter;importorg.apache.log4j
Stella981 Stella981
3年前
Spring Boot filter
在SpringBoot中自定义filter本文我们将会讲解如何在SpringBoot中自定义filter并指定执行顺序。定义Filter很简单,我们只需要实现Filter接口即可,同时我们可指定@Order来确定其执行顺序,我们定义两个filter如下:@Slf4j@Component@Order(1)p
Stella981 Stella981
3年前
Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)
javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置。①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Java应用程序②Filter过滤器:javax.servlet.Filter是一个接口,实现请求的拦截和放行,并可添加新功能,达到过滤请求的作用③list