`

实现拦截器——自定义拦截器(上篇)

阅读更多

 

实现拦截器——编写自己的拦截器(上篇)

 

 

(Interceptor)拦截器在Struts2中有着至关重要的作用,Struts2本身定 义了丰富的拦截器,但作为一个框架(Framework)扩展性也是不可 少的,Struts2为了提高自身的灵活性允许我们自己创建拦截器, 且自定义拦截器的创建过程相当容易.

 

 

实现接口Interceptor

在Struts2中要编写自己的拦截器需要实现Xwork框架中的一个简单接口:Interceptor

[com.opensymphony.xwork2.interceptor.Interceptor],这个接口只规定了3个方法.

public interface Interceptor extends Serializable {

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

在这个接口中 destroy 和 init 方法分别执行清理和初始化工作,intercept方法执行拦截器的主要工作.

 

 

继承AbstractInterceptor

当我们不需要让拦截器执行清理和初始化工作时,Struts2还提供了一个选择AbstractInterceptor[com.opensymphony.xwork2.interceptor.AbstractInterceptor].这是一个抽象类,并实现了Interceptor接口,只是重写了destroy 和 init 方法,在方法中没有执行任何操作.

public abstract class AbstractInterceptor implements Interceptor {

    public void init() {

    }

    public void destroy() {

    }

    public abstract String intercept(ActionInvocation invocation) throws Exception;

}

 

 

编写自己的拦截器

在上面我们提到了编写自定义拦截器的方式,拦截器直接或间接的实现Interceptor接口.现在让我们来自己写一个来了解一下.下面例子演示日志拦截器的实现,拦截器做的工作是拦截到请求后获得请求IP和请求URL 然后在磁盘上创建文件记录下IP和URL并记录请求时间,OK我们开始吧.

package lele.struts2.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoggerInterceptor extends AbstractInterceptor {

@Override

public String intercept(ActionInvocation invocation) throws Exception {

 

LoggerService logger = DefaultLoggerService.getInstance();

HttpServletRequest request=ServletActionContext.getRequest();

String ip=request.getRemoteAddr();

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

logger.createLog(ip,url);

return invocation.invoke();

}

}

以上代码在intercept 方法中获得了IP地址和URL,然后将IP和URL作为参数传到了createLog方法中来创建日志.中途考虑到文件的操作问题单独把文件操作封装成单个实例服务,代码如下:

package lele.struts2.interceptor;

public interface LoggerService {

 

public void createLog(String ip,String url);

 

}

然后用默认的日志服务类来实现具体文件操作,代码如下:

public class DefaultLoggerService implements LoggerService {

 

private static DefaultLoggerService instance;

 

private BufferedWriter bw=null;

 

public static DefaultLoggerService getInstance() {

 

if (instance == null) {

instance = new DefaultLoggerService();

}

 

return instance;

}

 

private DefaultLoggerService() {

}

@Override

public void createLog(String ip, String url) {

synchronized (this) {

String filename = "e:/log/request.log";

File f = new File(filename);

try {

bw = new BufferedWriter(new FileWriter(f, true));

StringBuilder sb = new StringBuilder();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

sb.append(sdf.format(new Date()));

sb.append("   ");

sb.append( ip );

sb.append("   ");

sb.append( url );

sb.append("(");

sb.append(this);

sb.append(")");

bw.write(sb.toString());

bw.newLine();

catch (Exception ex) {

throw new RuntimeException(ex);

finally {

this.closeFile();

}

}

}

public void closeFile(){

try{

if(bw!=null)

bw.close();

}catch(Exception ex){

throw new RuntimeException(ex);

}

}

}

OK,一个日志拦截器就做好了(至于拦截器的配置我就不多说了,配置问题可以看我的上篇文章).注意编写拦截器时一定要求拦截器是无状态的,因为在Struts2中并不保证每个请求都会创建单独的拦截器实例,如果拦截器带有状态则容易引发并发问题.

拦截器是Struts2中比较重要的一个功能,很好的理解拦截器可以帮助自己编写复用性很高的代码.

就和大家聊到这了,希望能对Struts2中的拦截器有所理解.下面章节会和大家聊到Struts2中的几个比较重要的拦截器,也是比较实用的一些,然后再自己来做一个拦截器,并引出Struts2拦截器编程中应注意的一些问题.

 

我的联系方式:

MSN: wang4717@live.cn

QQ:  471776739

Mail: wanglehappy9112@gmail.com

 

 

1
1
分享到:
评论

相关推荐

    实现拦截器——自定义拦截器(下篇)

    NULL 博文链接:https://wang4717.iteye.com/blog/802525

    Struts2的拦截器——Struts2拦截器的基础知识.pptx

    自定义拦截器需要继承`org.apache.struts2.interceptor.Interceptor`接口或实现`com.opensymphony.xwork2.interceptor.Interceptor`抽象类,并实现相应的拦截方法。 6. **AOP的优势**: - AOP使开发者能够将关注点...

    Struts拦截器案例——登陆

    总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...

    在struts1中使用拦截器——saif-0.1.jar

    在saif-0.1.jar这个库中,可能包含了自定义的拦截器实现。这些拦截器可能为Struts1框架提供了特定的功能增强,例如优化性能、增强安全性或者实现了特定的业务逻辑。由于没有提供具体的saif-0.1.jar文件内容,我们...

    MyBatis拦截器(csdn)————程序.pdf

    在实现拦截器时,可以继承Executor、StatementHandler、ParameterHandler和ResultSetHandler接口,覆盖相应的方法,从而实现自定义的拦截逻辑。 例如,下面是一个简单的Executor拦截器的实现: ```java public ...

    【SpringMVC】 4.3 拦截器(csdn)————程序.pdf

    一个自定义拦截器的实现通常需要继承`HandlerInterceptor`接口,并实现其中的三个方法:`preHandle`、`postHandle`和`afterCompletion`。 1. `preHandle`方法:预处理方法。此方法在请求即将被处理器处理之前执行。...

    SpringMVC拦截器——实现登录验证拦截器的示例代码

    在Spring MVC框架中,拦截器(Interceptor)是一种用于处理请求和响应之间通用...通过创建自定义拦截器类并配置拦截器链,我们可以在用户访问特定资源之前进行权限检查,确保只有已登录的用户才能访问受保护的页面。

    spring-boot 自定义xml配置web请求拦截器

    这涉及到Spring Boot的Web层架构、AOP(面向切面编程)以及自定义拦截器的概念。Spring Boot简化了传统Spring应用的配置,但仍然允许用户通过XML配置来扩展功能,特别是在某些特定场景下,如集成第三方库或定制化...

    源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    在本章中,我们将深入探讨"处理器拦截器"在SpringMVC框架中的应用与实现,这是SpringMVC中一个至关重要的组件,它允许我们在请求处理前后执行自定义逻辑。通过学习这一主题,我们可以更好地理解SpringMVC的工作流程...

    弹窗广告拦截器

    《弹窗广告拦截器——打造清静网络环境的利器》 在互联网的海洋中,我们时常会被各种烦人的弹窗广告打扰,它们无孔不入,严重影响了我们的浏览体验。"弹窗广告拦截器"正是为了解决这一问题而诞生的工具,其核心功能...

    SpringMVC学习(十二)——SpringMVC中的拦截器

    在Spring MVC框架中,拦截器(Interceptor)是一个至关重要的组件,它允许我们在处理请求之前或之后执行自定义逻辑。在本篇文章中,我们将深入探讨Spring MVC中的拦截器机制,了解其工作原理、如何配置以及实际应用...

    struts 拦截器实现权限拦截

    在Struts2中,通过自定义拦截器,我们可以轻松地实现这一功能。 首先,我们需要理解Struts2拦截器的工作原理。拦截器是基于Java的动态代理模式实现的,它们形成一个拦截器栈,当请求到达Action时,会按照栈中定义的...

    Struts 2的基石——拦截器(Interceptor)

    实际开发中,可以结合业务需求创建自定义拦截器,例如实现一个登录拦截器,检查每次请求是否已登录,未登录则跳转到登录页面。这样可以有效地提升代码的复用性和可维护性。 总之,Struts 2的拦截器机制是其强大功能...

    Activiti命令拦截器和设计模式.docx

    该方法会将用户自定义的拦截器添加到拦截器链中,并将其设置为 CommandExecutor 的第一步。 命令模式的特性在 Activiti 中的体现: 1. 将命令进行封装——Activiti 封装成了 Command 对象; 2. 命令发出者和执行者...

    Android-OkHttp的请求重试拦截器

    本文将深入探讨OkHttp中的一个重要特性——请求重试拦截器,以及如何利用这一特性来优化网络请求。 首先,理解OkHttp拦截器的概念。OkHttp允许我们在请求发送前和响应返回后进行拦截,这为我们提供了定制网络请求...

    Android课程设计——骚扰短信拦截器.zip

    总的来说,"Android课程设计——骚扰短信拦截器"是一个全面的Android开发实践项目,它涵盖了Android组件、API使用、用户界面设计、权限管理以及测试优化等多个方面。通过这个项目,开发者不仅可以提升技能,还能为...

    Spring Boot mvc web拦截器实现权限访问控制等功能(csdn)————程序.pdf

    在Spring Boot MVC应用中,权限访问控制是必不可少的一部分,它确保了...通过自定义拦截器并注册到Spring Boot的应用上下文中,我们可以轻松地在请求处理的各个阶段插入自己的逻辑,从而实现安全的、优雅的Web服务。

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...

    如何在SpringBoot中使用拦截器(csdn)————程序.pdf

    实现`HandlerInterceptor`接口,这是Spring MVC提供的一个接口,用于自定义拦截逻辑。你需要重写`preHandle`方法,在这个方法中编写你的拦截规则。例如,这里检查`HttpServletRequest`中的session,如果找不到名为...

Global site tag (gtag.js) - Google Analytics