Java Web 学习笔记

过滤器

Filter

功能:

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

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

如何使用?

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

1package com.janeroad.filter; 2 3import javax.servlet.*; 4import java.io.IOException; 5 6public 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

1<filter> 2 <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是从上到下顺序读取的

1<filter> 2 <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中的配置

1<filter> 2 <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>

等于

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

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

1、统一处理中文乱码

2、屏蔽敏感词

1package com.southwind.filter; 2 3import javax.servlet.*; 4import javax.servlet.annotation.WebFilter; 5import java.io.IOException; 6 7@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); } } 8 9import javax.servlet.ServletException; 10import javax.servlet.ServletException; 11import javax.servlet.annotation.WebServlet; 12import javax.servlet.http.HttpServlet; 13import 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、控制资源的访问权限

1package com.southwind.filter; 2import javax.servlet.*; 3import javax.servlet.annotation.WebFilter; 4import javax.servlet.http.HttpServletRequest; 5import 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,以二进制的形式传输数据

1<%@ page contentType="text/html;charset=UTF-8" language="java" %> 2<html> 3<head> 4 <title>Title</title> 5</head> 6<body> 7 <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对象的操作完成上传,面向对象的思想

1package com.janeroad.servlet; 2 3import org.apache.commons.fileupload.FileItem; 4import org.apache.commons.fileupload.FileUploadException; 5import org.apache.commons.fileupload.disk.DiskFileItemFactory; 6import 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(); } } }

 来源: 真相只有一个

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java ee 部分分析

1logfilteranalysis分析filter:与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查

java web 开发入门

Javaweb,是java技术用来解决web互联网领域的技术总和。Javaweb技术主要包括客户端和服务端,java在客户端的服务有javaapplet,不过用的非常少,大部分应用在服务端,比如Servlet,JSP和第三方框架等。Web就是网页的意思,它表示Internet上主机提供的可供访问的资源。Web资源主要分为静态web资源和动态web

SSH基础的面试题1

1.简述struts2的执行流程!(http://static.oschina.net/uploads/space/2016/0311/155522_1MzX_2646795.jpg)1)客户端初始化一个指向Servlet容器请求;2)这个请求经过一系列的过滤器(Filter)3)接着Filter

Servlet的Filter的使用

    Filter可认为是Servlet的“加强版”,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成相应,这一点与Servlet相同,但实际上很少会这样使用。使用Filter的完整流程是:Filter对用户的请求进行预处理,接着将请求交给Servlet进行处理并响应

SpringBoot学习之路:09.Spring Boot中添加Filter应用

   上篇文章中说了SpringBoot中是如何使用servlet的,本文将讲解在SpringBoot中对过滤器Filter的实现一.编写MyFilter实现Filter接口packagecom.maxbill.core.webbox.filter;importorg.apache.log4j