关于python网站拦截器介绍的信息

本文目录一览:

python getattribute、get、getattr、getitem等用法

__getattribute__

__getattribute__是属性访问拦截器,就是当类的属性被访问时,会自动调用类的__getattribute__方法。

参考代码:

代码执行过程中,当调用实例对象attribute的name属性时,不会直接打印,而是把name的值作为实参传进__getattribute__方法中,经过一系列操作后,再把name的值返回。

python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。

我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等。

getattr、hasattr、setattr

对象属性的判断。

参考代码:

__getattr__、__setattr__、__delattr__

类支持 . 操作来访问属性;定制功能:耗时、日志等等。

参考代码:

__getitem__、__setitem__、__delitem__

类支持通过[]来访问属性

参考代码:

__get__、__set__、__delete__

参考代码:

参考文档:

一个网站的权限管理,用过滤器还是拦截器更好

Struts2项目通过使用Struts的if标签进行了session判断,使得未登录的用户不能看到页面,但是这 种现仅仅在view层进行,如果未登录用户直接在地址栏输入登录用户才能访问的地址,那么相应的action还是会执行,仅仅是不让用户看到罢了。这样显然是不好的,所以研究了一下Struts2的权限验证。

权限最核心的是业务逻辑,具体用什么技术来实现就简单得多。

通常:用户与角色建立多对多关系,角色与业务模块构成多对多关系,权限管理在后者关系中。

对权限的拦截,如果系统请求量大,可以用Struts2拦截器来做,请求量小可以放在filter中。但一般单级拦截还不够,要做到更细粒度的权限控制,还需要多级拦截。

不大理解filter(过滤器)和interceptor(拦截器)的区别,遂google之。博文中有介绍:

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 。

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 。

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求 起作用 。

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能 。

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容 器初始化时被调用一次 。

filter过滤器 和拦截器的区别

1、首先要明确什么是拦截器、什么是过滤器

1.1 什么是拦截器:

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈 Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2. 拦截器的实现原理:

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

1.3 什么是过滤器

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:

①以常规的方式调用资源(即,调用servlet或JSP页面)。

②利用修改过的请求信息调用资源。

③调用资源,但在发送响应到客户机前对其进行修改。

④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

1.4 Servlet过滤器的基本原理

在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

2、拦截器与过滤器的区别 :

1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

拦截器的代码实现(以struts2为例):

1、在xml文件中如何定义拦截器

interceptors

interceptor name=”filterIPInterceptor”

class=”com.xxxx.web.FilterIPActionInterceptor” /

interceptor-stack name=”filterIPStack”

interceptor-ref name=”defaultStack” /

interceptor-ref name=”filterIPInterceptor” /

/interceptor-stack

/interceptors

2、怎么遍别写自定义拦截器

public class FilterIPActionInterceptor extends AbstractInterceptor

{

/** 日志控制. */

private final Log log = LogFactory.getLog(getClass());

/**

* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)

*/

@Override

@SuppressWarnings(“unchecked”)

public String intercept(ActionInvocation invocation) throws Exception

{

String result = null;

// 获得当前方法名.

String methodName = invocation.getInvocationContext().getName();

String currIp = null;

try

{

if (invocation.getAction() instanceof PortletAction)

{

PortletAction action = (PortletAction) invocation.getAction();

currIp = action.getRequest().getRemoteAddr();

}

String ip = ApplicationResource.getHotValue(“ALLOW_CACHE_IP”);

if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))

{

log.error(“允许刷新的IP不存在或当前请求的IP非法.”);

throw new NoAllowIPException();

}

else

{

String[] ips = ip.split(“,”);

boolean errorIp = true;

for (String s : ips)

{

if (s.equals(currIp))

errorIp = false;

}

// 判断IP

if (errorIp)

throw new NoAllowIPException();

}

result = invocation.invoke();//调用被拦截的方法

}

catch (Exception e)

{

log.error(“异常类名:” + invocation.getAction().getClass());

log.error(“异常方法:” + methodName, e);

throw e;

}

return result;

}

}

3、怎么编写过滤器

1、在web.xml里面配置自定义的拦截器

filter

filter-nameRedirect Filter/filter-name

filter-classcom.xx.filter.RedirectFilter/filter-class

/filter

filter-mapping

filter-nameRedirect Filter/filter-name

url-pattern/xx/xx/*/url-pattern

/filter-mapping

2、如何编写自定义的拦截器

public class RedirectFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain filterChain) throws IOException, ServletException {

// 获取URL

Long startTime = null;

if (log.isDebugEnabled())

{

startTime = System.currentTimeMillis();

}

HttpServletRequest httpRequest = (HttpServletRequest) request;

String url = httpRequest.getRequestURL().toString();

if (url == null || url.trim().length() == 0) {

return;

}

if (url.indexOf(luceneCreateMapping) != -1

|| url.indexOf(luceneSearchMapping) != -1) {

doFilterForxxx(request, response, url);

} else {

doxxxx(request, response, url);

}

if (log.isDebugEnabled())

{

long endTime = System.currentTimeMillis();

Thread currentThread = Thread.currentThread();

String threadName = currentThread.getName();

log.debug(“[” + threadName + “]” + ” “

+ this.getClass().getName() + ” ” + url + ” “

+ (endTime – startTime) + ” ms”);

}

// 激活下一个Filter

filterChain.doFilter(request, response);

}

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:27
下一篇 2024-12-12 13:27

相关推荐

  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29

发表回复

登录后才能评论