专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Java Web拦截器

Java Web拦截器

更新时间:2020-10-23 17:56:08 来源:动力节点 浏览967次

我们都知道filter是Java Web三大组件之一,作为Java Web的过滤器,filter可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。言归正传,Java Web过滤器和拦截器在某些地方有相似之处,但又不是用一种东西。那么,不同于filter在Java Web中显眼的地位,Java Web拦截器在Java Web中扮演着一个什么样的角色呢?本文我们就来一探究竟。


拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。它依赖于Web框架,在SpringMVC中就是依赖于SpringMVC框架。拦截是AOP的一种实现策略。而在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。


在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于Web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

示例代码

在xml文件中如何定义Java Web拦截器



怎么编写自定义拦截器

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;

}

}


通过本文的讲解加上我们之前对filter的了解,可以得出如下结论:

Java Web过滤器需要在web.xml中配置,依赖于Servlet;而Java Web拦截器需要在SpringMVC中配置,依赖于框架;

由此可见,Java Web拦截器的作用和filter相比毫不逊色,Java Web拦截器相关知识也是我们应该加以重视的重要考点,在Java基础面试题中也是频繁出现,我们应该牢牢掌握。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>