三分钟带你了解过滤器(过滤器百度文库)

2023-08-13 13:55:23

 Filter

Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。 它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。

使用 Filter 的完整流程

Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。

Filter 链

在一个 web 应 用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。

若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的顺序执行。

原理

在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据。

在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据 需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。

2、实现

我们可以通过实现一个叫做 javax.servlet.Fileter 的接口来实现一个过滤器, 其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观 察生命周期。 Filter 的实现只需要两步:

Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。

Step2: 在 web.xml 文件中对编写的 filter 类进行注册,并设置它所能拦截 的资源。

public class Filter01 implements Filter { /** * 初始化方法,只执行一次 * 服务器启动即初始化 */ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("拦截处理"); //放行 chain.doFilter(request, response); System.out.println("拦截结束"); } /** * 销毁方法 */ @Override public void destroy() { // TODO Auto-generated method stub } }

<filter> <filter-name>filter01</filter-name> <filter-class>com.czb.filter.Filter01</filter-class> </filter> <filter-mapping> <filter-name>filter01</filter-name> <url-pattern>/download</url-pattern><!-- 需要拦截的路径,也可以同时配置多个,通常设置为 /* --> </filter-mapping>

3、非法访问拦截

静态资源 css、js、images等 (statics目录下的资源,都放行)放行指定页面 login登录 (不需要登录即可访问的页面,都要放行)放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等)登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态)

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; // 得到当前的路径 String url = request.getRequestURI(); System.out.println(url); // 1、静态资源 css、js、images等 (statics目录下的资源,都放行) if (url.contains("/statics")) { // 放行 chain.doFilter(request, response); return; } //2.登录页面 if (url.contains("LoginAjax.html")) { chain.doFilter(request, response); return; } // 3、放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等) // 得到用户行为 String actionName = request.getParameter("actionName"); if (url.contains("/servlet01")) { // 确认模块 // 确认用户行为 // if ("form".equals(actionName)) { // 放行 chain.doFilter(request, response); return; // } } // 4、登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态) // 获取session域对象的值 User user = (User) request.getSession().getAttribute("user"); if (user != null) { // 放行 chain.doFilter(request, response); return; } response.sendRedirect("LoginAjax.html"); return; }

servlet3.0注解

在 Servlet3.0 之前一直使用的都是配置文件的方式来实现各种组件, Servlet3.0 之后提供了注解,可以达到零配置。实际情况一般使用配置+注解结合。

1. @WebServlet

开发 servlet 项目,使用@WebServlet 将一个继承于 javax.servlet.http.HttpServlet 的类定义为 Servlet 组件。在 Servlet3.0 中 , 可以 使用@WebServlet 注解将一个继承于 javax.servlet.http.HttpServlet 的类标注为可 以处理用户请求的 Servlet。

用注解配置 Servlet

@WebServlet("/Servlet01")//最常用 //@WebServlet(name="Servlet01",value="/Servlet001") //@WebServlet(name="Servlet01",value={"/Servlet001","/Servlet0001"})

也可以配置多个 urlPatterns 来指定多个访问路径

//@WebServlet(urlPatterns="/S01") @WebServlet(urlPatterns={"/S01","/S001"})

2. @WebFilter

//@WebFilter 用来配置过滤器 @WebFilter("/*")

3. @WebListener

Servlet3.0 提供@WebListener 注解将一个实现了特定监听器接口的类定义为监听器。将实现了 ServletContextListener 接口的 MyServletContextListener 标注为监听器。

4. @MultipartConfig

使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。 Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传 的文件进行操作

@WebServlet("/upload") @MultipartConfig // 表示支持文件上传 //注:如果前台表单提交时的表单类型为enctype="multipart/form-data", //后台必须要加@MultipartConfig注解!!!!!

@WebServlet("/load01") @MultipartConfig public class Upload01 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取part对象,myFile为文件域的name属性值 Part part=request.getPart("myFile"); //获取上传的文件名 String name=part.getSubmittedFileName(); if(name==null||"".equals(name.trim())){ return; } //获取文件存放路径 String realPath=request.getServletContext().getRealPath("/"); part.write(realPath+name); System.out.println(realPath+"-----"+name); } }


以上就是关于《三分钟带你了解过滤器(过滤器百度文库)》的全部内容,本文网址:https://www.7ca.cn/baike/65889.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜