【java web】web核心技术(Filter&Listener)

本文介绍了在Web开发中,过滤器(Filter)如何实现登录验证和敏感字符过滤,通过装饰模式和代理模式增强对象功能。同时,展示了如何使用监听器(Listener)进行初始化配置,如读取敏感词汇文件并加载到内存中。这些技术在增强安全性、优化功能和维护系统稳定方面起到关键作用。
摘要由CSDN通过智能技术生成

Filter

过滤器

完成通用的操作

案例:登录验证

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    // 强制转换
    HttpServletRequest request = (HttpServletRequest) req;

    // 获取资源请求路径
    String uri = request.getRequestURI();
    // 判断是否包含登录的相关资源路径
    if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCode")) {
        chain.doFilter(req, resp);
    } else{
        // 要登录,需验证
        Object user = request.getSession().getAttribute("user");
        if (user != null) {
            // 有数据,放行
            chain.doFilter(req,resp);
        } else {
            // 没有数据,跳转页面
            request.setAttribute("login_msg","你尚未登录,请登录!");
            request.getRequestDispatcher("/login.jsp").forward(request,resp);
        }
    }



}

案例:敏感字符过滤

增强对象功能:

设计模式:1.装饰模式,2.代理模式

下面代码演示代理模式

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

    // 创建代理商对象
    ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 增强getParameter方法
            // 判断是否是getParameter方法
            if (method.getName().equals("getParameter")) {
                String value = (String) method.invoke(req,args);

                if (value != null) {
                    for (String str : list) {
                        if (value.contains(str)) {
                            value = value.replaceAll(str,"***");
                        }
                    }
                }
                return value;
            }
            // 如果不是,照常执行
            return method.invoke(req,args);
        }
    });


    chain.doFilter(proxy_req, resp);
}

先加载

private List<String> list = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
    try {
        // 获取文件真实路径
        ServletContext servletContext = config.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
        // 读取文件
        BufferedReader br = new BufferedReader(new FileReader(realPath));
        String line = null;
        while ((line = br.readLine())!=null) {
            list.add(line);
        }
        br.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Listener

监听器

注册监听:事件源上发生某件事件后,执行监听器代码

ServletContextListener

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();

        // 加载资源文件
        String initParameter = servletContext.getInitParameter("con");

        // 获取真实路径
        String realPath = servletContext.getRealPath(initParameter);

        try {
            //加载进内存
            FileInputStream fis = new FileInputStream(realPath);
        }catch (Exception e) {
            e.printStackTrace();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉了的凉茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值