java的filter方法(过滤器的功能)

一.什么是Filter?Filter译为过滤器。 由于Servlet规范是开放的,借助于公众与开源社区的力量,Servlet规范越来越科学,功能也越来越强大。2000年,Sun公司在Servlet2.3规范中添加了Filter功能,并在Servlet2.4中对Filter进行了细节上的补充。二.运行原理:当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重…

大家好,又见面了,我是你们的朋友全栈君。

一.什么是Filter?
Filter译为过滤器。 由于
Servlet
规范是开放的,借助于公众与开源社区的力量,
Servlet
规范越来越科学,功能也越来越强大。
2000
年,
Sun
公司在
Servlet2.3
规范中添加了
Filter
功能,并在
Servlet2.4
中对
Filter
进行了细节上的补充。

二.运行原理:

当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重新设置请求协议的相关信息等,然后再将请求发送给服务器端的Servlet进行处理。当Servlet对客户端做出响应时,过滤器同样可以进行拦截,将响应内容进行修改或者重新设置后,再响应给客户端浏览器。在上述过程中,客户端与服务器端并不需要知道过滤器的存在。

在一个Web应用程序中,可以部署多个过滤器进行拦截,这些过滤器组成了一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到服务器端的Servlet。具体执行流程如下:

java的filter方法(过滤器的功能)


三.实现例子:

比如用户访问服务器admin文件夹下一个文件,使用filter拦截

Servlet API中提供了一个Filter接口,实现过滤器只需要实现该接口即可

首先创建一个Filter的java类,TestFilter.java,使其继承于接口Filter

TestFilter.java:

import java.io.IOException;
import javax.servlet.Filter;
public class TestFilter implements Filter
{
	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException
	{
		// TODO Auto-generated method stub		
		HttpServletResponse htteResp=(HttpServletResponse)arg1;			
		if(false)   
         	{
			htteResp.sendError(400,"无管理员权限访问!");
			return;
		}
		else
		{
		        arg2.doFilter(arg0,arg1);  //不感兴趣,不做任何处理,继续执行代码
		}
	}
}

然后修改web.xml,添加如下节点:

  <filter>
    <filter-name>AdminFilter</filter-name>
    <filter-class>TestFilter</filter-class>   
  </filter>
  <filter-mapping>
  <filter-name>AdminFilter</filter-name>
   <url-pattern>/admin/*</url-pattern>
  </filter-mapping>

这个意思是当url中有/admin/*这样的格式,将交给TestFilter去过滤

我们在项目中添加一个admin文件夹,然后在其中放一个admin.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
       这里是管理员页面!
</body>
</html>

然后启动tomcat访问admin.jsp

使用http://localhost:8080/FilterTest/admin/admin.jsp    (其中FilterTest是项目名称)

然后会显示如下:  

java的filter方法(过滤器的功能)

因为代码中if(false)的判断,所以filter并不生效

将if(false)修改成if(true),在重启tomcat,效果如下:

java的filter方法(过滤器的功能)

Filter生效了,返回错误信息:无管理员权限访问!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合

    SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合PS:因一客户的运营环境需求,需要nginx和resin整合,nginx负责处理静态页面部份,resin负责处理动态JSP部份。Resin是CAUCHO公司的产品,是一个非常流行的applicationserver,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发,而且Resin速度比Tomcat快,稳定性也比Tomcat好。关于各软件版本,我使用

    2022年5月12日
    50
  • Android中CheckBox与CompoundButton源码解析[通俗易懂]

    Android中CheckBox与CompoundButton源码解析[通俗易懂]经历过了前面一系列的讲解,下面我们直接来看看系统里面的CheckBox与CompoundButton类的源码文件。你肯定会发现很多熟悉的地方。结合下面源码,我们对它们进行解析解析,它里面使用的就是自定义drawablestate。我们首先直接看CheckBox的源码publicclassCheckBoxextendsCompoundButton{publicCheckBo

    2022年6月7日
    25
  • Innodb_large_prefix

    Innodb_large_prefix

    2021年10月22日
    84
  • 【MySQL】使用Visio绘制数据库关系模型图

    【MySQL】使用Visio绘制数据库关系模型图使用Visio绘制数据库关系模型图1新建项目文件—新建–软件和数据库—数据库模型图点击后,出现如下界面:2绘制左侧“实体关系”中将“实体”形状拖放到绘制界面,如下图3编辑实体名称,如下图:4编辑列点击“列”如下图:完成实体:客人信息表GuestRecord,如下截图完成实体:客房表Room(同上操作),如下图5关系绑定5.1添加列RoomID到客人信息表5.2将“实体关系”中的关系工具拖放到某个实体上(鼠标不松开),直到该实体边框变红色,松开;箭头指

    2022年7月16日
    13
  • pstools使用教程

    pstools使用教程pstools是sysinternals开发的一个功能强大的nt/2k远程管理工具包。官方网址为http://www.sysinternals.com/下载地址为http://www.sysinternals.com/files/Pstools.zipPstools主要包含以下程序:(1)psexecpsexec是一个远程执行工具…

    2025年5月22日
    0
  • 公有云和私有云的区别正确的是_私有云安全性相对公有云更好

    公有云和私有云的区别正确的是_私有云安全性相对公有云更好私有云和公有云的显著差别在于对数据的掌控。只需一分钟,下面几张图就能让你看懂公有云和私有云的本质区别。私有云和公有云的显著差别在于对数据的掌控。采用公有云服务的企业必须将数据托管于云服务商的数据中

    2022年8月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号