• Web-过滤器


    作用

    拦截请求,过滤响应

    实现

    实现 Filter 接口

    执行顺序

    根据过滤器的配置方式分别

    1. 配置文件(web.xml)配置,执行顺序由标签的配置顺序决定

    2. 注解配置,执行顺序由filterName属性值的字母顺序决定

    常见问题

    无法实现Filter接口

    找到apache-tomcat-8.5.75->lib->Servlet-api.jar导入

    字符编码设置

    1. @WebFilter(urlPatterns = {"/*"})
    2. public class CharsetFilter implements Filter {
    3.    @Override
    4.    public void init(FilterConfig filterConfig) throws ServletException {
    5.   }
    6.    @Override
    7.    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    8.        servletRequest.setCharacterEncoding("UTF-8");
    9.        servletResponse.setCharacterEncoding("UTF-8");
    10.        servletResponse.setContentType("text/html;charset=UTF-8");
    11.        filterChain.doFilter(servletRequest, servletResponse);
    12.   }
    13.    @Override
    14.    public void destroy() {
    15.   }
    16. }

    web.xml配置Filter

    1. <filter>
    2.    <filter-name>Charserfilter-name>
    3.    <filter-class>com.xxx.controller.filter.CharsetFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6.    <filter-name>Charserfilter-name>
    7.    <url-pattern>/*url-pattern>
    8. filter-mapping>

    敏感词汇过滤(没怎么搞懂流程)

    1. @WebFilter(urlPatterns = {"*.do"})
    2. public class BanFilter implements Filter {
    3.    // 存放违规字符的集合
    4.    private List words = new ArrayList<>();
    5.    // 加载时读取文件字符存入集合
    6.    @Override
    7.    public void init(FilterConfig filterConfig) throws ServletException {
    8.        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\Knowledge\\编程\\00-资料库\\05-File\\words.txt"), "utf-8"))) {
    9.            String str = null;
    10.            while ((str = reader.readLine()) != null) {
    11.                words.add(str);
    12.           }
    13.       } catch (IOException e) {
    14.            e.printStackTrace();
    15.       }
    16.   }
    17.    // 过滤违规字符
    18.    @Override
    19.    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    20.        String text = servletRequest.getParameter("text");
    21.        // 创建请求对象的代理对象,
    22.        // 在代理对象的方法执行过程中判断当前方法是不是getParameter
    23.        // 是则获取值进行相应修改
    24.        // 最后将代理传递给servlet
    25.        ServletRequest requestProxy = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(),
    26.                servletRequest.getClass().getInterfaces(), new InvocationHandler() {
    27.                    // method:真实对象调用某个方法的方法对象
    28.                    @Override
    29.                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    30.                        // 调用真实对象方法
    31.                        Object returnValue = method.invoke(servletRequest, args);
    32.                        // 获取真实对象调用的方法的方法名
    33.                        String methodName = method.getName();
    34.                        if (methodName.equals("getParameter")) {
    35.                            String value = (String) returnValue;
    36.                            for (String word : words) {
    37.                                if (value.contains(word)) {
    38.                                    value = value.replace(word, "*");
    39.                               }
    40.                           }
    41.                            return value;
    42.                       }
    43.                        return returnValue;
    44.                   }
    45.               });
    46.        // 放行时传递的是代理对象
    47.        filterChain.doFilter(requestProxy,servletResponse);
    48.   }
    49.    @Override
    50.    public void destroy() {
    51.   }
    52. }

    登录校验

    基于会话完成登录状态的保存,向系统中发送请求时,通过过滤器拦截请求,验证会话中是否存储了登录状态,如果有,则放行,如果没有,则重定向到登录页面(登录成功必须向会话对象中保存登录状态)

    校验特定资源

    重点在登录校验过滤器的url-pattern的配置上

    1. // 对特定资源进行登录校验
    2. @WebFilter(urlPatterns = "*.do")
    3. public class LoginFilter implements Filter {
    4.    @Override
    5.    public void init(FilterConfig filterConfig) throws ServletException {}
    6.    @Override
    7.    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    8.        HttpServletRequest req = (HttpServletRequest) servletRequest;
    9.        HttpServletResponse resp = (HttpServletResponse) servletResponse;
    10.        // 获取Session值
    11.        Object loginUser = req.getSession().getAttribute("user");
    12.        // 未登录状态
    13.        if (null == loginUser) {
    14.            // 跳转回主页面
    15.            resp.sendRedirect("/html/main.html");
    16.        // 登录状态    
    17.       } else {
    18.            // 放行
    19.            filterChain.doFilter(req, resp);
    20.       }
    21.   }
    22.    @Override
    23.    public void destroy() {}
    24. }

    校验所有资源

    重点在需要放行的资源上

    1. // 对所有资源进行登录校验
    2. @WebFilter(urlPatterns = {"/*"})
    3. public class LoginFilter implements Filter {
    4.    @Override
    5.    public void init(FilterConfig filterConfig) throws ServletException {}
    6.    // 在该方法内部完成登录校验
    7.    @Override
    8.    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    9.        HttpServletRequest req = (HttpServletRequest) servletRequest;
    10.        HttpServletResponse resp = (HttpServletResponse) servletResponse;
    11. // 获取请求地址,如:@WebServlet("/test.do") == /test.do
    12.        String requestURI = req.getRequestURI();
    13.        if (requestURI.endsWith("login.jsp")
    14.                || requestURI.endsWith("register.jsp")
    15.                || requestURI.endsWith("login.do")
    16.                || requestURI.endsWith("register.do")
    17.       ) {
    18.            //请求特定资源放行
    19.            filterChain.doFilter(req,resp);
    20.        //其它所有的请求和页面都必须进行登录校验
    21.       }else{
    22.            Object loginUser = req.getSession().getAttribute("User");
    23.            //没有登录:打回
    24.            if (null == loginUser) {
    25.                resp.sendRedirect("/html/login.html");
    26.            //登录过了:放行
    27.           }else{
    28.                filterChain.doFilter(req,resp);
    29.           }
    30.       }
    31.   }
    32.    @Override
    33.    public void destroy() {}
    34. }

  • 相关阅读:
    MathType7 公式编辑器嵌入Word\WPS,MathType 公式编辑常用小技巧
    数据库优化方法及思路分析
    Map和Set的区别
    linux-文件服务
    Object.defineProperty()
    linux ubuntu中配置nfs共享存储服务
    揭秘 FineVideo 数据集构建的背后的秘密
    mysql 命令
    面试:Android中的一些小问题随笔
    10月30日,深圳见!51camera与您相约机器视觉展
  • 原文地址:https://blog.csdn.net/Xstruggle/article/details/125892198