目录
当浏览器向服务器发送请求的时候,过滤器可以将请求拦截下来,完成一些特殊的功能,比如:编码设置、权限校验、日志记录等。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
过滤器的特点:在servlet之前和之后都会被执行
String getFilterName();//得到filter的名称。
String getInitParameter(String name);//返回定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext();//返回Servlet上下文对象的引用。
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化过滤器
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//具体的执行逻辑
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset = utf-8");
//执行完过滤跳转到原请求目的地
chain.doFilter(req,resp);
}
@Override
public void destroy() {
//关闭过滤器
}
}
方式一:在web.xml文件中部署
<filter>
?? ?<filter-name>过滤器名称</filter-name>
?? ?<filter-class>过滤器所在的路径</filter-class>
</filter>
<filter-mapping>
?? ?<filter-name>过滤器名称</filter-name>
?? ?<url-pattern>需要过滤的资源或请求</url-pattern>
</filter-mapping>
方式二:通过@WebFilter注解部署
如上面字符编码过滤器代码所示。
@WebFilter常用属性如下:
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于标签。 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 的取值。 |
1.防止用户未登录就执行后续操作
? String name=(String)session.getAttribute("key");
? if(name==null){
? ?? ?//跳转到登录页面
? }
2.设置编码方式--统一设置编码
3.加密解密(密码的加密和解密)
4.非法文字筛选
5.下载资源的限制? ??
1.过滤器必须实现Filter接口。
2.过滤器拦截的请求执行完毕之后,必须要放行,否则我们的请求就不会被执行。
filterChain.doFilter(request,response); //过滤器放行
3.Filter的拦截路径的配置
①拦截具体的资源路径:/index.jsp,只有访问index.jsp的时候才会被拦截
②目录拦截:/user/*,访问/user下的所有资源,都会被拦截
③后缀名拦截:*.jsp 访问后缀名为jsp的资源,都会被拦截
④拦截所有:/* 访问所有的资源,都会被拦截
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
调整过滤器链的执行顺序
过滤器链式排列的顺序由web.xml描述信息中<filter-mapping>元素的顺序决定
实际开发中,可以综合业务逻辑需要和性能等因素,通过调整<filter-mapping>元素的顺序,合理安排过滤器链中各过滤器的执行次序
在Web开发中,过滤器链通常用于以下情况:
请求过滤: 当收到一个请求时,过滤器链可以依次对请求进行处理,比如身份验证、日志记录、数据验证等。每个过滤器都可以对请求进行修改、验证或拒绝。
响应过滤: 在生成响应后,过滤器链也可以对响应进行处理,比如压缩响应、添加特定的头部信息等操作。
在使用过滤器链时,常见的步骤包括:
定义过滤器: 创建并定义需要的过滤器,确保它们按照你的需求进行处理。每个过滤器通常负责某个特定的任务或功能。
配置过滤器链: 将这些过滤器按照执行顺序配置到一个链中,确保它们以正确的顺序依次执行。
请求处理: 当一个请求到达时,它将通过过滤器链。每个过滤器都有机会对请求进行处理,最终请求会顺序通过所有过滤器。
响应处理: 类似地,生成响应后,响应也将通过同样的过滤器链。这些过滤器可以修改、处理或记录响应。
使用过滤器链的好处是我们可以将不同的过滤功能分散到多个过滤器中,分工明确,避免一个过滤器做太多的业务处理,降低了代码的耦合度,这体现了单一职责的设计原则,应用了责任链的代码设计模式.
1.创建servlet
package com.by.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FilterTestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
//request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username: " + username+"===password"+password);
//设置字符编码
//response.setContentType("text/html;charset=utf-8");
response.getWriter().write("username: " + username+"===password"+password);
}
}
2.配置servlet
<servlet>
<servlet-name>filterTest</servlet-name>
<servlet-class>com.by.servlet.FilterTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>filterTest</servlet-name>
<url-pattern>/filterTest</url-pattern>
</servlet-mapping>
3.创建filter_test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="filterTest" method="post">
<input type="text" name="username"/><br>
<input type="text" name="password"/><br>
<input type="submit" value="提交">
</form>
</body>
</html>
监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
Request:
ServletRequestListener (处理request对象创建和销毁)
ServleRequestAttributeListener (处理域对象中的数据添加 修改 删除)
Session:
HttpSessionListener (处理session对象创建和销毁)
HttpSessionAttributeListener 处理session域对象中的数据添加 修改 删除)
HttpSessionBindingListener (处理session对象监听器绑定和解绑定接口)
HttpSessionActivationListener (处理session对象钝化和激活状态接口)
Application
ServletContextListener (处理application对象创建和销毁)
ServletContextAttributeListener (处理application域对象中的数据添加 修改 删除)
根据不同的监听域,实现不同的接口来创建Listener监听器。比如我们创建一个类来监听Session对象的创建与销毁:
@webListenet
public class MySessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁");
}
}
监听器部署
在web.xml文件中添加以下代码
<listener>
<listener-class>监听器所在的路径</listener-class>
</listener>
或者使用@WebListener注解