struts2自定义拦截器

需求:通过访问一个action我们可以直接跳转到一个页面,如果跳转到另一个页面之前需要先判断用户的登录状态,就可以考虑使用struts2的拦截器来实现(过滤器也可以实现)

过滤器与struts2拦截器的区别
过滤器理论上可以过滤任何内容,比如html,jsp,servlet,图片路径,action等等,拦截器只能用来拦截action

1.首先自定义一个拦截器类
package intercept;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

import entity.User;

public class LoginIntercepor extends MethodFilterInterceptor {
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
        if(user != null) {
            return invocation.invoke();
        } else {
            return "loginFailed";
        }
    }
}
2.然后在struts.xml中进行配置
<package name="demo1" namespace="/" extends="struts-default">
        <!-- 声明自定义的拦截器 -->
        <interceptors>
            <interceptor name="loginInterceptor" class="intercept.LoginIntercepor"></interceptor>
        </interceptors>

        <action name="user_*" class="action.UserAction" method="{1}">
            <!-- 使用自定义的拦截器 -->
            <interceptor-ref name="loginInterceptor">
                <!-- 配置不需要拦截的方法 -->
                <param name="excludeMethods">login</param>
            </interceptor-ref>
            <!-- 使用默认拦截器 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>

            <result name="loginSuccess">/loginSuccess.jsp</result>
            <result name="loginFailed">/login.jsp</result>
            <result name="index">/index.jsp</result>
        </action>
    </package>

这样当访问需要拦截的action时,就会在执行action中的方法之前先执行拦截器的代码,来判断用户是否登陆

(1)访问登录的action方法时,拦截器不会拦截,因为在配置中<param name="excludeMethods">login</param>此方法被忽略
(2)访问其他的action方法,拦截器执行,根据当前session中是否存在用户进行不同的处理逻辑。return invocation.invoke();表示去执行action中的方法,return "loginFailed";表示将跳转到配置中loginFailed所对应的页面去。

附:UserAction中的代码

package action;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import entity.User;

public class UserAction extends ActionSupport {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public String login() {
        if("admin".equals(username) && "123456".equals(password)) {
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            ServletActionContext.getRequest().getSession().setAttribute("user", user);
            return "loginSuccess";
        }
        return "loginFailed";
    }

    public String index() {
        return "index";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值