Servlet(监听器与过滤器)(下)

Servlet的扩展工具及应用

1.监听器接口(Listener)

(1).监听器的概述:

简介:

①来自Servlet规范中,存在共8个接口;
②需要开发人员自行去实现,并无现成的实现类;

作用:

用于监控 【作用域对象生命周期变化时刻】
或者【作用域对象共享数据变化时刻】

(2).作用域对象:

概念:

Servlet中,服务器内存中可存在某些条件下为两个Servlet间提供数据共享的对象,叫作作用域对象

分类:

Ⅰ.ServletContext:全局作用域对象;
Ⅱ.HttpSession:会话作用域对象;
Ⅲ. HttpServletRequest:请求作用域对象;

监听器接口实现类开发规范:

Ⅰ.根据实际情况,选择适当的作用域对象;
Ⅱ.重写监听器接口声明【监听事件处理方法】;
Ⅲ.在web.xml文件将监听器接口实现对象注册到Http中。

web.xml文件的注册语法:

<listener>
	<listener-class>(接口实现src下的地址+类名)</listener-class>
</listener>

(3).监听器接口详解:

a.ServletContextListener接口:

作用:

合法的检测【全局作用域对象】被初始化销毁时刻;

语法规则:

//【全局作用域对象】被初始化时被调用
public void contextInitialized();

//【全局作用域对象】被销毁时被调用
public void contextDestroyed();
b.ServletContextAttributeListener接口:

作用:

合法监测全局作用域对象共享数据变化时刻。

语法规则:

//在【全局作用域对象】中添加数据时被调用
public void attributeAdded();

//在【全局作用域对象】中更新数据时被调用
public void attributeReplaced();

//在【全局作用域对象】中删除数据时被调用
public void attributeRemoved();

修改数据的案例:

//拿到【全局作用域对象】
ServletContext application = request.getServletContext();
//增添数据
application.setAttribute("key1",100);
//修改数据
application.setAttribute("key1",200);
//删除数据
application.removeAttribute("key1");

2.过滤器接口(Filter)

(1).过滤器的概述:

简介:

Ⅰ.来自Servlet规范,存在与servlet-api.jar包下;
Ⅱ.需开发人员自行实现,无现成实现类;

作用:

Ⅰ.用于服务器调用资源以前,进行拦截;
Ⅱ.拦截Http服务器,检测当前请求的合法性;
Ⅲ.拦截Http服务器,对当前请求进行增强操作;

(2).使用规范:

Ⅰ.创建一个类,实现Filter接口;
Ⅱ.实现doFilter()方法;
Ⅲ.在web.xml中注册到Http服务器中;

在web.xml中的注册语法:
需被拦截文件名处的三种泛指:
(假设img目录下存储图片ice.jpg)
Ⅰ./img/ice.jpg
Ⅱ.*.jpg
Ⅲ./img/*

<filter>
	<filter-name>(类名)</filter-name>
	<filter-class>(src下地址)</filter-class>
</filter>
<filter-mapping>
	<filter-name>(类名)</filter-name>
	<url-pattern>(需被拦截的文件名)</url-pattern>
</filter-mapping>

(3).使用语法:

//当条件符合时,将【请求对象】和【响应对象】返还给服务器
filterChain.doFilter(request,response);

//过滤器做增强操作
//改变请求体的编码方式
request.setCharacterEncoding("utf-8");

(4).过滤器的应用(防止用户恶意登录)

概述:

用户恶意登录指不经过登陆步骤,直接通过地址栏访问登录后的页面。

令牌机制解决恶意登录:
使用过滤器之前:

Ⅰ.在登录界面给予用户会话作用域对象;
HttpSession session = request.getSession();
Ⅱ.在资源文件内添加检测机制:
if(session != null){}

缺点:
Ⅰ.无法对静态文件进行保护;
Ⅱ.如果网站资源较多,增加了开发难度。

使用过滤器之后:

Ⅰ.在登录界面给予用户会话作用域对象;
HttpSession session = request.getSession();
Ⅱ.书写过滤器的实现类并重写doFilter()方法:
Ⅲ.在web.xml下配置文件。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
	 /*由于servletRequest中没有getSession方法,必须将其转为其子接口HttpSession才能
        调出getSession方法,response同理*/
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session = null;

        //通过【请求对象】获取到请求行中的uri
        String uri = request.getRequestURI();
        //如果登录信息出现login相关的,过滤器无条件通过
        if (uri.indexOf("login")!=-1 || "/myWeb/".equals(uri)){
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        //如果访问其他资源文件,则需验证用户的session
        session = request.getSession(false);

        if (session != null){
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        request.getRequestDispatcher("login_error.html").forward(servletRequest, servletResponse);
    }

3.通信流程图的总结:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值