struts2中拦截器的简介与配置使用

拦截器是struts2框架的核心,struts2很多的功能都是构建在拦截器基础之上的,它是动态拦截Action调用的对象,提供了一种机制,使得开发者能够在一个Action前后执行需要的代码,可以在一个Action执行前组织他的执行,也能在Action执行后做一些相应的工作。同时他也提供了一种可以提取Action中可重用部分的方式。

拦截器

struts2拦截器是在访问某个Action或它的某个方法 、字段之前或之后实施拦截,struts2拦截器是可插拔的,是AOP的一种实现(AOP是OOP(Object-Oriented Programming,面向对象程序设计)的一种完善和补充,是软件技术和设计思想发展到一定阶段的自然产物)

一般情况下,拦截器都是通过代理的方式进行调用,当请求到达Struts2的ServletDispatcher(Web HTTP请求的调度器,所有对Action的请求都将通过ServletDispatcher调用)时,struts2会查找配置文件,并且根据配置文件的配置实例化相对的拦截器对象,并形成一个列表。每个Action请求都包装在一系列的拦截器内部。拦截器可以在Action执行之前做准备操作。也可以在之后进行操作,每个Action即可以将操作转交给下面的拦截器,也可以直接退出操作。

拦截器的配置

在Web应用中引入拦截器机制之后,就能够实现对Action通用操作的可插拔管理方式,这样的可插拔管理是基于struts.xml文件的配置来实现的。

定义拦截器的语法格式如下:

<interceptor name="拦截器名字" class="拦截器对应的java类型"/>

拦截器栈的配置

<interceptors>

<interceptor-stack name="拦截器栈的名字">

<interceptor-ref name="拦截器的名字"/>

</interceptor>

</interceptors>

拦截器的实例:

能够实现文字过滤的拦截器

Action:

public class ContentAction extends ActionSupport{
      private String name;//评论人
      private String content;//评论内容

      public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	@Override
    public String execute() throws Exception {
    	return SUCCESS;
    }
}

拦截器类:

public class ContentInterceptor extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
        Object obj = arg0.getAction();//获取Action的实例
        if(obj != null){
        	if(obj instanceof ContentAction){
        		ContentAction ca = (ContentAction)obj;//实例化ContentAction类
        		String content = ca.getContent();//获得用户提交的评论信息
        		int startIndex = content.indexOf('人');//检测字符人出现的位置
        		//截取从人开始往后的三个字符串
        		String str = content.substring(startIndex,startIndex + 3);
        		//如果用户发表的评论中包含有要过滤的文字
        		if(str.equals("人品差")){
        			content = content.replaceAll("人品差", "*");//以*替换要过滤的文字
        			ca.setContent(content);//将替换后的内容赋值给content属性
        		}
        		return arg0.invoke();
        	}else{
        		return Action.LOGIN;
        	}
        }
		return Action.LOGIN;
	}

}

重要的一步,在struts.xml中的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
   <package name="default" extends="struts-default" namespace="/">
<interceptors>
     <interceptor name="contentItp" class="com.mxl.interceptor.ContentInterceptor"/>
     </interceptors>
     <action name="content" class="com.mxl.actions.ContentAction">
      <result>/content_success.jsp</result>
      <result name="login">/content_send.jsp</result>
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="contentItp"/>
     </action>
</package>
</struts>

两个简单的页面:

content_send.xml:

 <s:form action="content.action" method="post">
     <s:textfield name="name" label="评论人" size="81"/>
     <s:textfield name="content" label="评论正文" cols="180" rows="120"/>
     <s:checkbox name="arr" label="我已阅读并同意当当网社区条款"/>
     <s:submit type="button" align="center"/>
    </s:form>

content_success.jsp:

<table cellpadding="0" cellspacing="0" border="0" align="left">
      <tr style="line-height:30px;">
      <td style="font-size:14px;font-weight:bold;" align="left">
           对Spring入门经典的评论
      </td></tr>
      <tr>
       <td style="font-size:12px;">
         评论人:<s:property value="name"/>
       </td>
      </tr>
      <tr>
         <td style="font-size:12px">
           评论正文:<s:property value="content"/>
         </td>
      </tr>
    </table>

不要忘了在开头的地方加上,<%@ taglib prefix="s" uri="/struts-tags" %>,

拦截器的方法过滤实例:

拦截器类:

public class LoginInterceptor extends MethodFilterInterceptor{
      @Override
    protected String doIntercept(ActionInvocation arg0) throws Exception {
          Map session=arg0.getInvocationContext().getSession();//获取Session对象
          String uname = (String)session.get("username");//获取session中的username对象,并赋值给uname变量
          System.out.println(uname + "XXXXXXXXXXXXX");
          if(uname != null && !uname.equals("")){//检测uname变量的值,如果不为NULL或不为"",则进行后续操作
        	  return arg0.invoke();
          }else{//否则,重新登陆
        	  session.put("errorMsg", "您还未登录,请登录!");
        	  return Action.LOGIN;
          }
    }
}

Action类:

public class UserAction extends ActionSupport{
      private String username;
      private String pwd;

      public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	@Override
    public String execute() throws Exception {
    	  return SUCCESS;
    }
	public String login(){
		if("admin".equals(username.trim())){
			ActionContext ac = ActionContext.getContext();
			ac.getSession().put("username", username);
			return SUCCESS;
		}else{
			this.addFieldError("username", "用户名/密码错误");
			return LOGIN;
		}
	}
}

struts.xml中的配置:

 <interceptors>
       <interceptor name="myitp" class="com.mxl.interceptor.LoginInterceptor"/>
   </interceptors>
   <action name="timer" class="com.mxl.actions.TimerAction">
      <result>/index.jsp</result>
      <interceptor-ref name="timer"/>
   </action>
   <action name="login" class="com.mxl.actions.UserAction">
   <result>/success.jsp</result>
   <result name="login">/login.jsp</result>
   <interceptor-ref name="defaultStack"/>
   <interceptor-ref name="myitp">
        <param name="excludeMethods">login</param>
   </interceptor-ref>
   </action>

两个页面:

login.jsp:

<font color="red" style="font-size:12px"><s:property value="#session.errorMsg"/></font>
     <s:form action="login!login.action" method="post">
        <s:textfield name="username" label="用户名" size="20"/>
        <s:password name="pwd" label="密码" size="20"/>
        <s:submit  type="button" value="登录"/>
     </s:form>

success.jsp:

<s:if test="#session.username==null">
		<font color="red">您还未登录,不能对本站进行任何操作,请<s:a href="login.action"
				namespace="/">登录</s:a>!</font>
	</s:if>
	<s:else>
	    欢迎您:<s:property value="#session.username"/>
	</s:else>
时间: 2024-10-13 21:15:21

struts2中拦截器的简介与配置使用的相关文章

Struts2中拦截器的简单实现

Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行struts.xml中引用 的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法.在Struts2的拦截器体系中, Struts2的内建拦截器完成了该框架的大部分操作,所以实际的开发过程中通常都是使用系统的拦截器而已.当然我们也可以开发自己的拦截器,类似于过滤器的开发. 原理: Struts2拦截器的实现原理相对简单,当请求Stru

struts2中拦截器(interceptor)小结

什么是拦截器? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式.在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.Struts2内置了很多拦截器,每个拦截器完成相对独立的功能,多个拦截器的组合体成为拦截器栈.最为重要的拦截器栈是

Struts2中拦截器的配置

在struts.xml文件中定义拦截器只需要给拦截器类指定一个拦截器名,这就完成了定义.拦截器使用<interceptor>标记来定义,格式如下 <interceptor name="拦截器名" class="拦截器类"></interceptor> 大部分情况下,如果有一个拦截器这样配置就够了.如果有多个拦截器,则需要写多个<interceptor>,而<interceptor>是写在<interc

struts2中拦截器与过滤器之间的区别

首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml        i. 下一步将会

Struts2中拦截器的使用

拦截器是Struts2框架的核心组成部分,框架的很多功能都是构建在拦截器基础之上.Struts2利用内建的拦截器完成了框架内的大部分操作,拦截器是AOP(面向方面编程)在Struts2框架中的具体实现. 下面是配置自定义拦截器的流程. 假设需要一个功能,在调用每个Action之前都能在控制台打印出Helloworld,要求使用Struts2拦截器来实现. 1.建立一个Action类MyAction.java和一个配置文件struts.xml,如下图. 2.编写MyAction.java实现一个年

说说struts2中拦截器的请求流程一(模拟大致流程)

本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让action在运行之前干什么就能干什么,而且action本身并"不知道"自己被拦截了. 文章主要分析了拦截器部分的流程,对于环境的获取与初始化并没有涉及,对这部分感兴趣的朋友可以参考 http://www.cnblogs.com/liuling/p/2013-8-10-01.html 在真

Struts2中拦截器

创建拦截器 package com.zhangpn.Intercepor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class PermissionIntercepor implements Interceptor{ @Ov

springmvc中拦截器的定义和配置

package com.hope.interceptor; import org.springframework.lang.Nullable;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;import javax.servlet.ht

struts2中拦截器和过滤器的比较

拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程(AOP)的就是在你的service或者一个方法前调用一个方法,或者在方法后调用