ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-04 10:03:09  阅读:185  来源: 互联网

标签:web req java String resp contains uri Listener public


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();
        }

    }

标签:web,req,java,String,resp,contains,uri,Listener,public
来源: https://blog.csdn.net/weixin_62726289/article/details/122772569

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有