过滤器的概念:
过滤器JavaWeb三大组件之一(servlet,listener,filter),它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
用户在发送请求,tomcat服务器拿到请求后,执行对应的servlet,给用户响应内容。有了过滤器后,用户发送请求,服务器tomcat接受到请求后,先执行过滤器,然后再去执行servlet
Filter:在执行用户请求的资源之前,会先执行过滤器,若过滤器放行的话,才会执行用户请求的资源,若过滤器没有放行,则用户请求的资源就无法执行了。
使用场景:
1、未登录用户的拦截
2、集中代码的切入(中文乱码问题的集中处理)
3、统计程序代码的执行效率
Filter作用:
1:可以拦截请求(request)
2:也可以拦截响应(response)
3:放行,同意通过连接器
4:统计
如何创建一个filter:
1:实现一个接口 filter
2:在web.xml中注册或在Filter中使用注解的方式@WebFliter("/*"),下边例子中使用注解的方式
在web.xml文件中进行配置
<filter>
<display-name>FilterDemo1</display-name>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.aaa.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对用户是否登录进行拦截
package com.aaa.Fliter;
import javax.servlet.*;
import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//采用注解方式配置:拦截所有请求
@WebFilter("/*")
public class Filter2 implements Filter {
public void destroy() {
System.out.println("...........过滤器销毁.........");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//先将req和resp转换成HttpServlet类型
HttpServletRequest request=(HttpServletRequest) req;
HttpServlerResponse response=(HttpServletResponse) resp;
//获取session中的对象(user)判断是否为null
Object user=request.getSession().getAttribute("user");
if(user!=null){
//user不为空说明已经登录,放行
chain.dofilter(request,response);
}else{
//user为空说明没有登录,跳转到登录界面,但是并不是所有的请求都要拦截,在这里还要去除一些,像请求登录界面,调用登录功能
String strs[]={"login.jsp","LS"};
//获取用户请求路径,然后判断用户请求路径中是否包含strs[]中的路径,如果包含就放行
String requestURI=request.getRequestURI();//得到请求的路径
//requestURI.contains("login.jsp");
// contanins:包含的判断,判断requestURI中的路径是否包含括号中的路径,如果有返回true,如果没有返回false
boolean tag=false;//利用tag的值判断是否拦截本此请求
//利用加强型for循环来对strs[]进行遍历
for(String str:strs){
if(request.contains(str)){
tag=true;
break;//tag为true时,跳出循环,因为已经匹配上资源了
}
}
//通过对tag的判断来看是否拦截此次请求
if(tag){
chain.doFilter(request,response);
}else{
response.sendRedirect("/lizzhen626/views/login.jsp(登录界面的项目路径)");
}
}
}
public void init(FilterConfig config) throws ServletException {
System.out.println("............过滤器打开...........");
}
}