栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

过滤器Filter的应用场景案例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

过滤器Filter的应用场景案例

过滤器:执行目标资源之前做预处理工作。
应用场景:
例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作
通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;
在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;
本文实例包含:
1.分IP统计网站的访问次数
2.粗粒度权限控制(拦截是否登录,拦截用户名admin权限)
3.解决全站字符乱码问题(POST和GET中文编码问题)

  1. 分IP统计网站的访问次数
    统计网站访问次数,首先不需要做拦截。
    只需要考虑使用什么样的“容器”来放置这个计数结果(Map),以及什么时候在哪里创建这个“容器”(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中)

Listener

package com.example.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.linkedHashMap;

@WebListener()
public class CListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //1.创建ServletContext
        ServletContext application = sce.getServletContext();
        //2.Map
        HashMap ipMap = new linkedHashMap<>();
        //3.把Map保存到ServletContext中
        application.setAttribute("ipMap",ipMap);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

Filter

package com.example.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.linkedHashMap;

@WebFilter("/*")
public class CFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.得到ServletContext中的IPMap
        ServletContext application = req.getServletContext();
        //2.获取客户端IP
        String IP = req.getRemoteAddr();
        //3.获得并操作Map
        linkedHashMap ipMap = (linkedHashMap) application.getAttribute("ipMap");
        if (ipMap.containsKey(IP)) {
            int ipValue = ipMap.get(IP);
            ipMap.put(IP, ++ipValue);
            System.out.println("添加了map IP = " + IP + "次数 = " + ipValue);
        } else {
            ipMap.put(IP, 1);
            System.out.println("添加了map IP = " + IP + "次数 = " + 1);
        }
        application.setAttribute("ipMap", ipMap);
        //4.放行
        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {

    }
}

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="y" uri="http://java.sun.com/jsp/jstl/core" %>




显示IP

${applicationScope.ipMap }

<%--这里不知道为啥没显示出来--%> <%--这里不知道为啥没显示出来--%>
IP地址 次数
${entry.key}${entry.value}
  1. 粗粒度权限控制(拦截是否登录,拦截用户名admin权限)

游客、会员、管理员三个粒度
A. 创建一个Fileter,过滤会员下的资源访问,这是保安1号 ,doFilter里检查session中权限标记,第一道检查工序,不是管理员=> 放行,第二道检查工序,不是会员=> 打回到登录/注册页面,如果是会员就放行!
B. 创建一个Fileter,过滤管理员下的资源访问,这是保安2号 ,doFilter里检查session中权限标记,查看是不是管理员,不是管理员=>打回到登录/注册页面,如果是管理员就放行!

  1. 解决全站字符乱码问题(POST和GET中文编码问题)

servlet:
POST:request.setCharacterEncoding(“utf-8”)
GET:
String username = request.getParameter(“username”)
username = new String(username.getBytes(“IOS-8859-1”),“UTF-8”);
响应的乱码问题:
response.setContextType(“text/html;charset=utf-8”)

参考资料:

  1. JavaWeb之 Filter(过滤器)
  2. 过滤器的几个实例
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/282144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号