1.过滤器、监听器和拦截器
过滤器:在servlet中,过滤器也就是 Filter ,它主要用于过滤字符编码,做一些统一的业务等等。是使用 javax.servlet.Filter 接口进行实现的。
在代码安全中,他常被用于防止XSS,防SQL注入,防任意文件上传等。在配置了Filter之后,它可以统一过滤危险字符,省时省力。
监听器:在servlet中,监听器也就是 Listener ,它主要用于做一些初始化的内容。是使用 javax.servlet.ServletContextListener 接口进行实现的。
如果同时有监听器和过滤器,监听器是在过滤器之前启动。
拦截器:依赖WEB框架,在SrpingMvc中就依赖SpringMVC框架。是属于面向切面变成的一种运用。
过滤器和拦截器的区别,分为以下五种:
拦截器是基于Java的反射机制的,而过滤器是基于函数回调
过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
拦截器可以访问action上下文、值栈里的对象,而过滤器不能
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
2.过滤器代码(Filter)
package com.test.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FilterTest implements Filter {
@Override
public void destroy(){
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String requestURI = request.getRequestURI();
if(requestURI.contains("r")){
chain.doFilter(request, response);
}else{
request.getRequestDispatcher("/").forward(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException{
}
}
3.在web.xml中配置注册过滤器
我们重写了 doFilter() 方法,代码逻辑如下:
首先通过 String requestURI = request.getRequestURI(); 获取URL路径。然后对路径进行判断, 如果路径中包含 /FirstServlet ,则放行。
否则就跳转到根路径下
过滤器标签需要要在servlet标签上面,程序会按照注册顺序进行执行。
如果涉及多个过滤器,也是按照注册顺序进行执行的。
注册过滤器有两种方式:一是上面通过 web.xml 进行注册,另一种是通过 @WebFilter() 注解的方式进行注册。
<!--配置过滤器-->
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.test.filter.FilterTest</filter-class>
</filter>
<!--映射过滤器-->
<filter-mapping>
<filter-name>FilterTest</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
4.运行项目,访问不通路径,观察不同效果