JavaWeb过滤器和监听器

我的网站:欢迎访问奥

过滤器和监听器

过滤器

过滤器的作用

Filter过滤器,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理;

编写步骤

写一个类去实现Filter接口,并实现接口中的所有方法;

在web.xml中配置或者使用注解配置【@WebFilter(“过滤器路径”)不推荐】

执行流程

1.会先去匹配过滤器,再是Servlet

2.会先去匹配过滤器(web.xml)

生命周期

服务和销毁跟Servlet一样

出生(实例化和初始化):

​ 默认是在项目部署的时候进行实例化和初始化,好处是可以提高效率,Fiter是单例的

过滤器链

就是多个过滤器

注意:在Servlet中请求不能重复,但是在过滤器里面可以重复,过滤器执行的顺序根据xml配置顺序有关

过滤器的其他配置

过滤器针对一个请求,一个请求执行一次过滤

重定向:多次请求,多次执行

转发:一次请求,执行一次

FilterConfig

ServletConfig – 获取Servlet的初始化参数

FilterConfig – 获取Filter的初始化参数

实现登录拦截

实现只能登录才能访问后面的页面功能,使用过滤器的demo

package com.ifueen.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
	HttpServletRequest request = (HttpServletRequest) req;
	HttpServletResponse response = (HttpServletResponse) resp;
	Object name = request.getSession().getAttribute("name");
	if (name==null) {
		response.sendRedirect("/index.jsp");
	}
	
	//放行
	arg.doFilter(req, resp);
	
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}
	
}

web.xml配置

<!-- 权限过滤 -->

	<filter>
		<filter-name>login</filter-name>
		<filter-class>com.ifueen.filter.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>login</filter-name>
		<url-pattern>/system/*</url-pattern>
	</filter-mapping>

实现字符编码解码过滤

在使用get请求的时候我们的tomcat会自动进行编码和解码,但是在使用post的时候就不会,所以我们用过滤器来进行一个编码解码

package com.ifueen.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EnCodingFilter implements Filter{

	FilterConfig config;	//定义全局的config
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		String encoding = config.getInitParameter("encoding");
		req.setCharacterEncoding(encoding);
		resp.setContentType("text/html;charset="+encoding);
		arg.doFilter(req, resp);//执行Servlet代码
		
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
	}
	
}

web.xml配置

<!-- 编码问题过滤 -->
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>com.ifueen.filter.EnCodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

监听器

监听器对象的创建和销毁

监听ServletContext对象的创建和销毁
ServletContext对象的创建和销毁:
创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext
销毁:服务器关闭或者项目从服务器中移除的时候

public class MyServletContextListener implements ServletContextListener{
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContext对象被创建了...");
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContext对象被销毁了...");
	}
}

监听器中的属性变更

ServletContextAttributeListener 对Context的监听

HttpSessionAttributeListener 对Session的监听

ServletRequestAttributeListener 对请求的监听

Demo

实现一个统计在线人数的监听器

package com.ifueen.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyListener implements HttpSessionListener{

	int count = 1000000;
	
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("开始监听");
		count+=100;
		arg0.getSession().getServletContext().setAttribute("count", count);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		count-=100;
		arg0.getSession().getServletContext().setAttribute("count", count);
		System.out.println(count);
	}
	

}

jsp页面

<%@ page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>在线人数</title>
</head>
<body>
	<h2>当前在线人数:<%=application.getAttribute("count")%></h2>
	<input type="button" value="登出" οnclick="location='logout'" />
</body>
</html>

web.xml配置

<!-- 监听器的配置 -->
	<listener>
		<listener-class>com.ifueen.listener.MyListener</listener-class>
	</listener>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值