Struts2_拦截器(Action拦截和全局拦截)

本文详细介绍了Struts2框架中的拦截器概念及其应用。包括Action拦截、全局拦截及方法拦截,并提供了具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事实上,机场比婚礼殿堂见证了更多真挚的亲吻,医院的墙壁比教堂的聆听了更多祷告。

拦截器有三种方式:

①Action拦截

②全局拦截

③方法拦截

先说说什么是拦截器:

  拦截器,顾名思义,拦截请求(Action),可以达到增强Action的功能,框架本身默认提供很多拦截器,大概有35种,但往往实际开发中,还需要自定义一些拦截器,比如:权限(访问)拦截。

再说说怎么实现拦截器:
  如果要实现拦截器,需要实现interceptor接口或者继承AbstractInterceptor抽象类,后者用的更多。

1.Action拦截

interceptor代码:

package com.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorDemo extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        String user=(String) ActionContext.getContext().getSession().get("user");
        if (user==null||"".equals(user)) {
            return "fail";
        }
        return invocation.invoke();
    }

}

struts.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">

    <struts>
        <package name="root" namespace="/" extends="struts-default">

        <!-- 配置拦截器 -->
            <interceptors>
                <interceptor name="interceptor1" class="com.interceptor.InterceptorDemo"></interceptor>
            </interceptors>
            <action name="log*" class="com.action.LogAction" method="log{1}">
                <result >/log{1}.jsp</result>
                <allowed-methods>login,logout</allowed-methods>
            </action>
            <action name="add" class="com.action.UserAction">
                <result>/addUser.jsp</result>
                <result name="fail">/login.jsp</result>

        <!-- 注意:在使用自定义的拦截器后,默认拦截器是不生效的,需要添加上默认拦截器 -->
                <interceptor-ref name="interceptor1"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
    </struts>

通过以上代码发现,action拦截只能拦截部分拦截请求,如果需要大面积拦截,就会出现很多重读代码,最好的办法就是将指定的部分action统一一起拦截掉,可以使用全局拦截。

2.全局拦截

全局拦截与Action拦截,区别就在于配置文件,Action代码没任何区别。

struts.xml关于拦截器和全局结果集代码:

<interceptors>
            <!-- 关联自己写的拦截器 -->
                <interceptor name="myInterceptor" class="com.interceptor.InterceptorDemo"></interceptor>
            <!--  把自己的拦截器加载到拦截器栈中-->
                <interceptor-stack name="myStack">
                    <interceptor-ref name="myInterceptor"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>

        <!-- 为当前包所有Action配置默认拦截器 -->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
        <!--全局结果集-->    
            <global-results>
                <result name="fail">/login.jsp</result>
            </global-results>

问题1:
  返回值问题,因为全局拦截器将包中所有Action都拦截掉,蛋拦截器中的返回值只能固定一个,那么此时,在所有拦截器的Action中,都需要配置与拦截器返回值相同的result,可以将返回值配置成全局结果集。
  
问题2:
  包中某些Action又不希望被拦截,比如:登录 ,登出 ,注册 等,两种解决方案:
①将这些功能直接放到jsp界面中,不使用Action。但是,不要轻易暴露实际访问的jsp页面地址。

②将这些不需要拦截的放到另一个包中。

③使用方法拦截。
这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值