过滤器相关

打印 上一主题 下一主题

主题 1041|帖子 1041|积分 3123

过滤器-filter

1. what

过滤器:拦截不符合过滤要求的请求,使其无法到达目标地

   用在什么地方:同一认证校验,同一编码设置等
  2. 如何创建filter

2.1 通过xml完成

1. 创建一个过滤器类
步骤:


  • 创建一个类,继承Filter接口
   public class MyFilter implements Filter
  

  • 实现接口的所有抽象方法
  • 放行符合条件的
   filterChain.doFilter(servletRequest,servletResponse);
  return;
  1. package com.zmq.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import java.io.IOException;
  5. /**
  6. * @program: web03work
  7. * @description: 过滤器
  8. * @author: zmq
  9. * @create: 2024-05-11 08:59
  10. **/
  11. public class MyFilter implements Filter {
  12.     @Override
  13.     public void init(FilterConfig filterConfig) throws ServletException {
  14.         //初始化过滤器-只有一次
  15.     }
  16.     @Override
  17.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  18.         //过滤规则
  19.         System.out.println("====过滤器====");
  20.         //放行
  21.         filterChain.doFilter(servletRequest,servletResponse);
  22.         System.out.println("===过滤器放行了===");
  23.     }
  24.     @Override
  25.     public void destroy() {
  26.         //销毁过滤器-浏览器或服务器关闭时
  27.     }
  28. }
复制代码
2. 注册过滤器并设置拦截规则
  1. <!--注册过滤器-->
  2.     <filter>
  3.         <filter-name>MyFilter</filter-name>
  4.         <filter-class>com.ykq.filter.MyFilter</filter-class>
  5.     </filter>
  6.     <!--过滤规则-->
  7.     <filter-mapping>
  8.         <filter-name>MyFilter</filter-name>
  9.         <!--
  10.            /*:表示拦截所有的请求
  11.            /views/*: 只拦截包含views/资源
  12.            /*.do: 拦截请求后缀未.do资源
  13.         -->
  14.         <url-pattern>/*</url-pattern>
  15.     </filter-mapping>
复制代码
2.2 使用注解

  1. @WebFilter(filterName = "MyFilter",urlPatterns = "/*")
  2. public class MyFilter implements Filter {
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.         //初始化过滤器-只有一次
  6.     }
  7.     @Override
  8.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9.         //过滤规则
  10.         System.out.println("====过滤器====");
  11.         //放行
  12.         filterChain.doFilter(servletRequest,servletResponse);
  13.         System.out.println("===过滤器放行了===");
  14.     }
  15.     @Override
  16.     public void destroy() {
  17.         //销毁过滤器-浏览器或服务器关闭时
  18.     }
  19. }
复制代码
3. 使用过滤器完成同一认证校验

   

  • ServletRequest是HttpServletRequest的父类,所以在获取请求路径前,需要将其强转为子类,因为父类中没有获取请求路径的方法
  • 获取请求路径:getServletPath()
  1. HttpServletRequest request = (HttpServletRequest) servletRequest;
  2.      HttpServletResponse response = (HttpServletResponse) servletResponse;
  3.      //哪些资源允许匿名访问 login.jsp页面  LoginServlet处理接口 注册页面  注册的处理接口  图片  css  js
  4.      //1.获取请求路径
  5.      String path = request.getServletPath();
复制代码

  • 同样,session对象需要通过getSession方法获取
  1. //登录成功的用户
  2.      HttpSession session = request.getSession();
  3.      User user = (User)session.getAttribute("user");
复制代码
  1. @WebFilter(urlPatterns = "/*")
  2. public class LoginFilter implements Filter {
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.     }
  6.     //ServletRequest是HttpServletRequest的父类
  7.     @Override
  8.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9.         HttpServletRequest request = (HttpServletRequest) servletRequest;
  10.         HttpServletResponse response = (HttpServletResponse) servletResponse;
  11.         //哪些资源允许匿名访问 login.jsp页面  LoginServlet处理接口 注册页面  注册的处理接口  图片  css  js
  12.         //1.获取请求路径
  13.         String path = request.getServletPath();
  14.         if ("/login.jsp".equals(path) ||
  15.                 "/LoginServlet".equals(path) ||
  16.                 path.endsWith(".jpg") ||
  17.                 path.endsWith(".gif") ||
  18.                 path.endsWith(".png") ||
  19.                 path.endsWith(".css") ||
  20.                 path.endsWith(".js")
  21.         ) {
  22.             //放行
  23.             filterChain.doFilter(request,response);
  24.             return;
  25.         }
  26.         //登录成功的用户
  27.         HttpSession session = request.getSession();
  28.         Object user = session.getAttribute("user");
  29.         if(user!=null){ //访问者登录成功过
  30.             //放行
  31.             filterChain.doFilter(request,response);
  32.             return;
  33.         }
  34.         //跳转到login.jsp
  35.         response.sendRedirect("/login.jsp");
  36.     }
  37.     @Override
  38.     public void destroy() {
  39.     }
  40. }
复制代码
4. 编码过滤器

   因为客户对编码的需求不同,可能需要自己调整编码格式,所以需要通过在xml文件中初始化encoding值来设置编码格式。
  1. <!--注册过滤器-->
  2. <filter>
  3.      <filter-name>MyFilter</filter-name>
  4.      <filter-class>com.ykq.filter.EncodingFilter</filter-class>
  5.      <init-param>
  6.          <param-name>encoding</param-name>
  7.          <param-value>utf-8</param-value>
  8.      </init-param>
复制代码
在类中设置encoding变量,用于接收初始化后的值
  1. private String encoding="gbk";
  2. //初始化---只会执行一次
  3. encoding=filterConfig.getInitParameter("encoding");
  4. servletRequest.setCharacterEncoding(encoding); //ISO-8859-1 java源码一旦写完就无法修改
  5. servletResponse.setCharacterEncoding(encoding);
  6. //放行
  7. filterChain.doFilter(servletRequest,servletResponse);
复制代码
  1. public class EncodingFilter implements Filter {
  2.     private String encoding="gbk";
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.         //初始化---只会执行一次
  6.         encoding=filterConfig.getInitParameter("encoding");
  7.     }
  8.     @Override
  9.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  10.         servletRequest.setCharacterEncoding(encoding); //ISO-8859-1 java源码一旦写完就无法修改
  11.         servletResponse.setCharacterEncoding(encoding);
  12.         //放行
  13.         filterChain.doFilter(servletRequest,servletResponse);
  14.     }
  15.     @Override
  16.     public void destroy() {
  17.         //销毁方法--当服务器重启或关闭时
  18.     }
  19. }
复制代码
  1.     <!--注册过滤器-->
  2.     <filter>
  3.         <filter-name>MyFilter</filter-name>
  4.         <filter-class>com.ykq.filter.EncodingFilter</filter-class>
  5.         <init-param>
  6.             <param-name>encoding</param-name>
  7.             <param-value>utf-8</param-value>
  8.         </init-param>
  9.     </filter>
  10.     <!--过滤规则-->
  11.     <filter-mapping>
  12.         <filter-name>MyFilter</filter-name>
  13.         <!--
  14.            /*:表示拦截所有的请求
  15.            /views/*: 只拦截包含views/资源
  16.            /*.do: 拦截请求后缀未.do资源
  17.         -->
  18.         <url-pattern>/*</url-pattern>
  19.     </filter-mapping>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表