过滤器和监听器的学习

1.过滤器的介绍

根据视频中的讲解,完成以下内容
(1)视频中的引入过滤器提到的项目中存在的问题是什么问题?
在session失效的情况下,所有依赖于session的操作都无法执行
(2)根据视频讲解说说你对过滤器的理解,以及你觉得过滤器的作用是什么?
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应 。

2.过滤器的创建和配置

(1)视频中在代码注释中描述的问题是什么?。
目前我们访问Servlet,是可以直接进行访问的,没有进行任何防护。可能会造成服务器资源的浪费,以及安全性不高。我们希望真的在请求被Servlet处理之前,进行一次请求的校验,符合要求再调用对应的Servlet进行请求处理
(2)创建过滤器要实现的接口是?。
Filter
(3)创建的过滤器类中需要实现的三个方法是?。

public class MyFilter implements Filter {
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		System.out.println("我是MyFilter拦截器");
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

(4)在web.xml中配置过滤器的代码是?

<filter>
  	<filter-name>myFilter</filter-name>
  	<filter-class>an.sz.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  	 <filter-name>myFilter</filter-name>
  	 <url-pattern>/*</url-pattern>
  </filter-mapping>

3.过滤器之doFilter和init和destory方法

(1)doFilter方法的作用是?参数是及作用是?。
服务器在接收到浏览器发过来的请求后,先解析请求信息,创建对象request和response然后根据请求URL地址判断如果符合过滤器的过滤范围,则会调用过滤器中的doFilter来进行请求拦截,并将request和response对象作为实参传递给doFilter方法。我们可以在doFilter方法中声明过滤器拦截代码
ServletRequest:接收此次拦截的请求的request实参
ServletResponse:接收此次拦截的请求的response实参
FilterChain:可以进行请求放行
chain.doFilter(request, response);
(2)init方法的执行时机是?
服务器启动时
(3)destory方法的执行时机是?
服务器关闭时
4.过滤器之拦截范围的配置
(1)过滤器的拦截范围的配置是?及拦截的范围是什么?
拦截所有:/*
拦截部分Servlet的请求:*.do
拦截指定Servlet的请求:和要拦截的指定的Servlet的url-pattern配置完全一致即可,例如:/my
5.过滤器案例之统一请求编码格式
(1)根据视频讲解使用过滤器完成编码格式的统一设置。

MyFilter:
public class MyFilter implements Filter{
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest sreq, ServletResponse sresp,
			FilterChain chain) throws IOException, ServletException {
		//设置请求编码格式
		sreq.setCharacterEncoding("utf-8");
		//设置响应编码格式
		sresp.setContentType("text/html;charset=utf-8");
			chain.doFilter(sreq, sresp);
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}
Web.xml配置:
<filter>
  	<filter-name>myFilter</filter-name>
  	<filter-class>an.sz.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>myFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

6.过滤器之session管理放行登录页面和登录请求

(1)视频中的session管理的基本思路是什么?
在过滤器中获取session对象,然后查看session中的数据是否还在如果数据没了,则因为session失效则重定向到登录页面。如果数据还在session没有失效,则放行
(2)视频中在过滤器中实现的session管理存在的问题是?。
问题1:在过滤器中使用session校验后发现登录页面的访问成了死循环,因为登录页面的请求也就是login.jsp的请求也会被过滤器拦截,而此时session中没有相关数据的造成又重定向到登录页面…
解决1:对login.jsp和登录请求进行放行

7.过滤器之session管理静态资源放行和登录页面跳转

(1)视频中session管理的代码仍然存在的问题是?
问题2:过滤器会拦截所有的请求,包括静态资源(css文件\js文件\image图片)请求也会拦截。造成页面中的样式和动态效果等出不来
解决2:对静态资源放行

8.过滤器之session管理ajax请求优化

(1)根据视频讲解在session管理代码中完成ajax请求的优化处理。

function del(uid){
	if(confirm("您确定要删除吗?")){			
		$.get("data",{method:"deleteInfo",uid:uid},function(data){
			if("true"==data){
				if(eval(data)){
					alert("用户删除成功");
					window.location.href = "data?method=selAllUser";
				}
			}else{
				window.location.href=location.href;
			}
		});
	}
}

9.过滤器之权限管理功能需求分析和数据库设计

(1)权限管理的需求是什么?。
不同的用户在对同一功能使用时,有的用户可以直接使用,有的用户会被提示权限不足。
(2)视频中讲解的思路是什么?
1、在数据库中创建一个URL权限表,该表存储了该系统需要被管理的URL。
2、在数据库中创建用户权限中间表,用来进行权限分配
3、在数据库中将权限给用户分配好
4、在用户登录成功后查询该用户具备的URL权限,存储到该用户的session中
5、在过滤器中对当前发起请求的用户的请求地址进行校验,校验该用户是否具备该请求地址的权限,如果具备则放行执行,如果不具备则提示权限不足。

10.过滤器之权限管理功能数据实现和登录查询权限实现

(1)根据视频,完成视频中的功能。

if("/project2/login.jsp".equals(uri) || ("/project2/data".equals(uri)&& "userLogin".equals(method)) || uri.startsWith("/project2/css/") || uri.startsWith("/project2/js/")|| uri.startsWith("/project2/images/")){
				//放行
				chain.doFilter(request, response);
			}else{
				//session管理(session统一校验)
					//获取Session对象
						HttpSession session = req.getSession();
						Object obj=session.getAttribute("user");
					//判断
						if(obj!=null){
							//获取权限信息
								List<Url> lu=(List<Url>) session.getAttribute("lu");
							//权限校验
								for(Url url:lu){
									if(url.getLocation().equals(method) || url.getLocation().equals(uri)){
										//放行
										chain.doFilter(request, response);
										return;
									}
								}
							//响应
								resp.getWriter().write("power");
								return;
						}else{
							//重定向到登录页面
							resp.sendRedirect("/project2/login.jsp");
						}
			}

11.过滤器之权限管理大结局

(1)根据视频完整实现权限管理功能
代码见上

12.监听器的引入和介绍

(1)视频中统计当前在线人数的思路是什么
统计当前系统的session的个数,一个session意味一个在线的用户。
在session被创建的时候使用计数器+1,session被销毁的时候计数器-1,
将计数器存储在ServletContext对象。
(2)视频中的监听器的作用是什么?
监听request、session、application三个域对象的创建,销毁和数据的变更
(3)完成删除功能的Servlet的实现

13.监听器的使用之监听request对象

(1)监听request对象的两个接口什么?
监听request的创建和销毁:ServletRequestListener
监听request作用域数据的变更:ServletRequestAttributeListener
(2)监听request对象的两个接口的方法是?作用分别是?
requestInitialized(ServletRequestEvent sre)监听request对象的初始化
requestDestroyed(ServletRequestEvent sre)监听request对象的销毁
attributeAdded(ServletRequestAttributeEvent srae)监听request对象添加数据
attributeRemoved(ServletRequestAttributeEvent srae)监听request对象删除数据
attributeReplaced(ServletRequestAttributeEvent srae)监听request对象修改数据
(3)在web.xml配置监听器的标签是?给出一个配置示例

标签:<listener></listener>
示例:<listener>
  	  <listener-class>an.sz.listener.MyListener</listener-class>
      </listener>

14.监听器之监听session和application对象

(1)监听session对象的接口是?
HttpSessionListener、HttpSessionAttributeListener

(2)监听session对象的接口的方法分别是?作用是?

//session的创建和销毁
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
	}
	//session内容添加、删除和修改
	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
	}

(3)监听application对象的接口是?

ServletContextListener、ServletContextAttributeListener

(4)监听application对象的接口的方法分别是?作用是?

//ServletContext对象的创建和销毁
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
	}
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
	}
	//ServletContext内容的添加、删除和修改
	@Override
	public void attributeAdded(ServletContextAttributeEvent arg0) {
	}
	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
	}
	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
	}

15.监听器案例之当前在线人数统计

(1)根据视频,完成统计当前在线人数功能。

Mian.jsp:
<div style="position: relative;left: 300px;"class="head-l"> 
  	<span style="color: white;font-size: 15px">当前用户在线人数为:${applicationScope.count}</span>
	</div> 
MyListener:
public class MyListener implements HttpSessionListener,ServletContextListener{
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	}
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		//获取ServletContext对象
		ServletContext sc = sce.getServletContext();
		//创建计数器
		int count = 0;
		//将计数器存储进sc对象中
		sc.setAttribute("count", count);
		System.out.println(count);
	}
	@Override
	public void sessionCreated(HttpSessionEvent hse) {
		//获取ServletContext对象
		ServletContext sc = hse.getSession().getServletContext();
		//获取计数器
		int count = (int)sc.getAttribute("count");
		System.out.println("aioefiadjkcsvkdhi"+count);
		//每创建一次session用户在线数加1
		++count;
		//将结果再存储进sc对象中
		sc.setAttribute("count",count );
		//System.out.println(count);
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent hse) {
		//获取ServletContext对象
		ServletContext sc = hse.getSession().getServletContext();
		//获取计数器
		int count = (int)sc.getAttribute("count");
		//每创建一次session用户在线数减1
		--count;
		//将结果再存储进sc对象中
		sc.setAttribute("count",count );
	}
}
Web.xml:
<listener>
  	<listener-class>an.sz.listener.MyListener</listener-class>
  </listener>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值