Servlet学习:(四)Servlet Filter
程序员文章站
2022-03-11 21:57:59
...
一、Filter简介
在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
二、Servlet 过滤器方法
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 |
public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 |
public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
四、创建Filter
package com.idark.register.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebFilter(filterName = "MyFilter", urlPatterns = "/*")
public class MyFilter implements Filter {
private List<String> allowServlet = new ArrayList<String>();
public MyFilter() {
allowServlet.add("/myFirstServlet");
allowServlet.add("/loginServlet");
allowServlet.add("/registerServlet");
allowServlet.add("/uploadServlet");
allowServlet.add("/cartServlet");
}
public void destroy() {
System.out.println("MyFilter destroy...");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
if (allowServlet.contains(request.getRequestURI())){
chain.doFilter(req, resp);
}else{
System.out.println("URI:" + request.getRequestURI() + ",Status : Not Pass");
}
}
public void init(FilterConfig config) throws ServletException {
System.out.println("MyFilter Init...");
}
}
url-pattern
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
- 绝对路径匹配:以/开头 不包含通配符 * 是一个绝对访问路径。例如:/demo、/index.jsp
- 目录匹配:以/ 开头,以 * 结尾。例如:/*、/servlet/*、/servlet/xxx/*
- 扩展名匹配:不能以/ 开头,也不能以*结尾 只能以后缀名结尾 例如:*.do、*.demo等
dispatcher
子元素可以设置的值及其意义
REQUEST
:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE
:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD
:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR
:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
五、创建Servlet,并测试
package com.idark.register.servlet;
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;
import java.io.PrintWriter;
/**
* 定义一个Servlet,名称为DemoServlet,mapping路径为/myFirstServlet
*/
@WebServlet(name = "DemoServlet",urlPatterns = "/myFirstServlet")
public class DemoServlet extends HttpServlet {
/**
* Servlet init
* @throws ServletException
*/
@Override
public void init() throws ServletException {
super.init();
System.out.println(getServletName() + " init...");
}
/**
* Post 请求
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Method:,"+ request.getMethod() +", Servlet:" + getServletName());
PrintWriter writer = response.getWriter();
writer.print("Hello , " + request.getParameter("name"));
}
/**
* Get 请求
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Method:,"+ request.getMethod() +", Servlet:" + getServletName());
PrintWriter write = response.getWriter();
write.print("Hello , This is my first servlet");
}
}
正确访问Servlet:
非正确访问Servlet及控制台输出:
上一篇: note_40:加载aar中的so失败
下一篇: Ubuntu16.04安装Docker
推荐阅读
-
Filter、Servlet、Listener的学习_动力节点Java学院整理
-
详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用
-
web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理
-
Filter、Servlet、Listener的学习_动力节点Java学院整理
-
详解Servlet之过滤器(Filter)
-
Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法
-
详解Servlet之过滤器(Filter)
-
Servlet3.0学习总结之基于Servlet3.0的文件上传实例
-
Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法
-
解决cannot be cast to javax.servlet.Filter 报错的问题