Struts2中的保安--拦截器

作者: 许小迪老师 | 来源:发表于2016-06-07 17:26 被阅读106次

引题:Struts2框架对很多功能进行了封装,这些功能是由拦截器实现的,所以拦截器是Struts2的核心。

下面便结合案例从三个部分讲解下拦截器。

1.what:拦截器是什么

Struts2的拦截器和Servlet中的过滤器类似。用生活中例子来说,拦截器的作用类似于“保安”的角色。

举个例子来说:
生活中,来访者要访问部队某团长,是不能直接进去,需要经过门口保安的检查和登记。
在Struts2中,在浏览器端发起请求的用户相当于来访者,一个个的action类相当于团长,而拦截器就是保安。
当用户在浏览器端访问某个action资源时,需要先经过拦截器的拦截,经过了拦截器的“检查”才可访问到对应的action资源。

拦截器的实现原理:
当请求一个action资源时,Struts2会先查找struts.xml配置文件,并根据配置实例化配置的拦截器对象,然后串成一个列表,最后一个个地调用列表中的拦截器。

在执行Action之前,先执行该Action中配置的所有拦截器的intercept方法,被该方法放行后才可执行Action。

2.why:为什么使用拦截器

如果不采用拦截器,那么很多常用的功能就需要手动写代码。

比如,“类型转换”。web项目,从浏览器端输入的参数都是以String类型传到服务器端的,但在服务器端并非全部存储为String类型,这时就需要进行类型转换),例子如下。

浏览器端登录界面输入信息以String类型传输
public class LoginAction extends ActionSupport {
    private String name;
    private int age;
    .......
}

如果采用了拦截器,就可以将强制类型转换功能(这个功能Struts2框架已写好了)写到拦截器中,配置好,不用每次写action时重新写一遍。

这样就使得程序具备了以下优点:

  • “功能”可插拔
  • 提取action中的共性代码,减少代码冗余

3.how:Struts2中怎么使用拦截器

3.1 Struts2的内置拦截器

Struts2本身提供了很多的拦截器,这些拦截器已经在struts-default.xml文件中定义,在Web应用程序中可以直接引用这些拦截器。

常用的内置拦截器有:

Struts2中常用的内置拦截器

使用方式:
只要在struts.xml中extends=“"struts-default”即可。

struts.xml
<struts>
   <package name="global" extends="struts-default">
   ...
</struts>
3.2 Struts2的自定义拦截器

(1)通过继承AbstractInterceptor写一个拦截器类

public class OneInteceptor extends AbstractInterceptor{
    @Override
    public void init() {
        System.out.println("OneIntecepto 初始化....");
    }
    @Override
    public String intercept(ActionInvocation inv) throws Exception {
        System.out.println("1:OneIntecptor在Action执行之前.....");
        //result是用来接收Action中方法的返回值
        String result = inv.invoke();//放行,去执行用户要访问的资源---action
        System.out.println("3:OneInteceptor在Action执行之后.....");
        return result;
    }
    @Override
    public void destroy() {
        System.out.println("OneInteceptor 销毁....");
    }
}

(2)LoginAction.java

//LoginAction
public class LoginAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        System.out.println("LoginAction执行...");
        return SUCCESS;
    }
}

(3)拦截器的定义和配置
在struts.xml中对拦截器进行定义和配置

<struts>
    <package name="global" extends="struts-default">
        <interceptors>
            <!-- 定义拦截器 -->
            <interceptor name="oneinte" class="cn.inspur.inteceptor.OneInteceptor"></interceptor>
        </interceptors>
        <action name="login" class="cn.inspur.action.LoginAction">
            <!-- 配置拦截器,使拦截器oneinte对LoginAction生效 -->
            <interceptor-ref name="oneinte"></interceptor-ref>
            <result name="success">/success.jsp
            </result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

结果截图如下:


运行结果

拦截器的应用

拦截器可以用来实现:拦截未登录用户访问页面的功能
这个案例的实现代码,有机会再跟大家完整分享。

相关文章

网友评论

    本文标题:Struts2中的保安--拦截器

    本文链接:https://www.haomeiwen.com/subject/pmsrdttx.html