struts2中的拦截器

说起struts2中的拦截器,就不得不谈到struts2的优点:

1.在软件设计上,Struts2没有像Struts1一样和ServletAPIStrutsAPI紧密耦合,Struts2的应用可以不依赖与ServetAPIStrutsAPIStruts2是无侵入式设计,而Struts1属于入侵式设计。

2. Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。

3. Struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。

4. Struts2提供多种表现层技术,如:jspfreeMarkerVelocity等。

5. Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。

6. Struts2提供了全局范围,包范围,和Action范围的国际化资源文件管理实现 。

可以看到拦截器就是其中之一,还有struts2提供了一套标签,比jstl还要强大。那么拦截器是如何使用的,需要怎样配置呢?

     Struts2中的拦截器主要用在两个方面,一是用户是否登录验证,二是拦截字符编码,避免出现乱码。下面是一个验证用户是否登录的拦截器:Action代码:

import javax.servlet.http.HttpServletRequest;

 

import org.apache.struts2.ServletActionContext;

 

import com.defu.vo.Userinfo;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

public class UserInterceptor extends AbstractInterceptor{

 

       @Override

       public String intercept(ActionInvocation invocation) throws Exception {

              HttpServletRequest request=ServletActionContext.getRequest();

              Userinfo user=(Userinfo)request.getSession().getAttribute("user");

              String result=null;

              if(user==null){//判断用户是否登录,为空则未登陆

                     request.setAttribute("usermsg", "1");//给客户端返回一个信息

                     return "cantdlog";//未登陆时的跳转页面,一般为登陆页

              }else{

                     return invocation.invoke();

              }

       }

}

看一下配置文件的信息,这里有技巧在里面,一般这些拦截都属于常用拦截,所以把它写在了struts2.xml中,并且将该包定义为抽象的,这样其他包直接继承这个包就可以使用里面给的拦截器了;

<</span>package name="interceptor" extends="struts-default" abstract="true">

<</span>interceptors>

<</span>interceptor name="userinterceptor" class="com.defu.interceptor.UserInterceptor">

</</span>interceptor>

<</span>interceptor-stack name="interceptorStack">

<</span>interceptor-ref name="userinterceptor"/>

<</span>interceptor-ref name="defaultStack"></</span>interceptor-ref>

</</span>interceptor-stack>

</</span>interceptors>

</</span>package>

这是在struts2.xml中配置的拦截器,在action中引用:

       <</span>package name="Interceptoractions" extends="interceptor">

              <</span>action name="jiesuan" class="com.defu.useraction.DealOrderAction">

                     <</span>interceptor-ref name="interceptorStack" />

                     <</span>result name="success">/mainpage/paymoney.jsp</</span>result>

                     <</span>result name="cantdlog">/goodscar.jsp</</span>result>

              </</span>action>

      

红色字体是继承了自己定义的包,interceptorStack是使用用户是否登录的拦截器栈,里面有用户是否登录的处理类。

 

下面给一个字符编码的拦截器:Action代码:

import java.util.Iterator;

 

import javax.servlet.http.HttpServletRequest;

 

import org.apache.struts2.StrutsStatics;

 

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

public class Charset extends AbstractInterceptor{

private String encoding="GBK";

 

       public void setEncoding(String encoding) {

       this.encoding = encoding;

}

 

       @Override

       public String intercept(ActionInvocation arg0) throws Exception {

              ActionContext ac=arg0.getInvocationContext();

              HttpServletRequest request=(HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);

              if(request.getMethod().toLowerCase().equals("post")){

                     request.setCharacterEncoding(encoding);

              }else{//get方法比较特殊,要特别处理

                     Iteratorinterator=request.getParameterMap().values().iterator();

                     while(interator.hasNext()){

                            String[] param=interator.next();

                            for(int i=0;ilength;i++){

                                   param[i]=new String(param[i].getBytes("ISO8859-1"),encoding);

                            }

                    }

              }

              return arg0.invoke();

       }

 

}

struts2.xml中的总配置:

<</span>package name="interceptor" extends="struts-default" abstract="true">

<</span>interceptors>

<</span>interceptor name="charset" class="com.defu.interceptor.Charset">

<</span>param name="encoding">UTF-8</</span>param>

</</span>interceptor>

<</span>interceptor-stack name="charsetstack">

<</span>interceptor-ref name="charset"/>

<</span>interceptor-ref name="defaultStack"></</span>interceptor-ref>

</</span>interceptor-stack></</span>interceptors>

</</span>package>

看我如何使用它:

<</span>package name="Interceptoractions" extends="interceptor">

<</span>action

name="lookforflowerbyinfo" class="com.defu.useraction.LookForflowerbyinfo">

<</span>interceptor-ref name="charsetstack"/>

<</span>result name="success">/main.jsp</</span>result>

</</span>action>

 

然后就没有然后了,你所有请求都会被编码为UTF-8也不用愁乱码问题了,整个世界安静了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值