java SSH第一章学习内容(Struts2拦截器,拦截器堆栈)

Struts2拦截器,需要导相应的jar包及复制Struts.xml文件到src目录下,web.xml进行修改


拦截器

在访问Action的时候进行拦截处理,需要继承AbstractInterceptor,重写intercept方法


案例一:在访问Action输出一句话(买电脑),使用拦截器在访问Action之前和之后各输出一句话(送键盘)(送鼠标)

1.新建一个买电脑的action,继承ActionSupport,进行输出一句话
public class BuyAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        System.out.println("买电脑");
        return SUCCESS;
    }
}

2.JSP页面提交到Action中
 <form action="/8.28lanjieqi/login.action">
       <input type="submit" value="提交">
   </form>

3.新建一个买电脑送优惠的类用作于拦截器,继承AbstractInterceptor,重写里面的intercept方法,这句话代表String obj=arg0.invoke();相当于拦截前输出或则拦截后输出,案例中表示拦截前送键盘,拦截后送鼠标
public class YouhuiAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("送键盘");
        String obj=arg0.invoke();
        System.out.println("送鼠标");
        return obj;
    }
}

4.修改struts.xml,在里面定义、使用拦截器

<!-- 实例一 -->
        <interceptors>
            <!-- interceptors标签里的interceptor定义拦截器 -->
            <interceptor name="YouhuiAction" class="com.action.YouhuiAction">
            </interceptor>
        </interceptors>
        <action name="login" class="com.action.BuyAction">
            <!-- 结果为“success”时,跳转至success.jsp页面 -->
            <result name="success">/index.jsp</result>
            <!-- 设置使用拦截器 ,defaultStack是核心拦截器,如果只设置自己的,就不再走Struts核心拦截器 -->
            <interceptor-ref name="YouhuiAction"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>


运行结果:


拦截器堆栈
如果拦截器过多,可以把打放进一个自定义的拦截器堆栈当中,当有action需要访问的时候,可以在配置文件中进行设置堆栈名即可


如在上述案例中多一个拦截器,可以把该拦截器放进拦截堆栈中,让需要使用拦截器的Action进行调用
1.创建送货拦截器
public class SonghuoAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        String obj=arg0.invoke();
        System.out.println("点赞好评免费送货");
        return obj;
    }
}

2.在配置文件中设置堆栈

        <!--  堆栈,把需要的拦截器放进堆栈,当调用的使用直接输入堆栈别名即可 -->
        <interceptors>
            <!-- interceptors标签里的interceptor定义拦截器 -->
            <interceptor name="YouhuiAction" class="com.action.YouhuiAction">
            </interceptor>
            <interceptor name="SonghuoAction" class="com.action.SonghuoAction">
            </interceptor>

            <!-- 定义拦截器堆栈 -->
            <interceptor-stack name="tt">
                <interceptor-ref name="YouhuiAction"></interceptor-ref>
                <interceptor-ref name="SonghuoAction"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 定义默认拦截器引用 -->
        <default-interceptor-ref name="YouhuiAction">

        </default-interceptor-ref>

        <!-- 指定拦截器引用 -->
        <action name="login" class="com.action.BuyAction">
            <!-- 结果为“success”时,跳转至success.jsp页面 -->
            <result name="success">/index.jsp</result>
            <interceptor-ref name="tt"></interceptor-ref>
        </action>


运行结果:





案例二:用拦截器登录验证,如用户必须在登录页面通过用户名和密码访问登录的Action跳转到首页,防止用户直接访问首页的Action

1.创建实体类,里面有name+pwd的属性,get+set方法

2.在login.jsp页面中设置访问login.action

 <form action="/8.28lanjieqilogin/login.action">
       用户名:<input type="text" name="users.name"/>
       密码:<input type="password" name="users.pwd"/>
       <input type="submit" value="提交"/>
   </form>

3.新建loginAction,调用实体类,继承ActionSupport用于重写execute()方法,实现SessionAware接口用于获得Session存值,用于判断用户是否通过登录跳转到首页
public class loginAction extends ActionSupport implements SessionAware{
    private Map session;
    private Users users;
    public Users getUsers() {
        return users;
    }
    public void setUsers(Users users) {
        this.users = users;
    }
    public Map getSession() {
        return session;
    }
    @Override
    public String execute() throws Exception {
        if (users.getName().equals("admin")&&users.getPwd().equals("123456")) {
            session.put("users", users);
            return SUCCESS;
        }else {
            return ERROR;
        }
    }
    @Override
    public void setSession(java.util.Map<String, Object> session) {
        this.session=session;  
    }
}

4.创建首页的Aciton,当访问了该Action进行输出一句话
public class IndexAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        System.out.println("谢谢您的光临");
        return SUCCESS;
    }
}

5.创建跳转Action的拦截器,验证用户是否通过登录页面跳转过来的,需要继承AbstractInterceptor,重写intercept方法,判断之前存的Session是否为空,为空则跳转为登录页面,如不为空则正常执行
public class LLAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("进入拦截器");
        Map session = arg0.getInvocationContext().getSession();
        if (session.get("users")!=null) {
            return arg0.invoke();
        }else {
            return Action.LOGIN;
        }
    }
}

6.修改一下配置文件,定义、配置监听类
<interceptors>
    <interceptor name="LLAction" class="com.action.LLAction"></interceptor>
    </interceptors>
    
        <action name="login" class="com.action.loginAction">
            <!-- 结果为“success”时,跳转至success.jsp页面 -->
            <result name="success">/index.jsp</result>
            <!-- 结果为"error"时,跳转至fail.jsp页面 -->
            <result name="error">/login.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
        <action name="index" class="com.action.IndexAction">
            <result name="success">/index.jsp</result>
            <result name="login">/login.jsp</result>
            <result name="error">/login.jsp</result>
            <interceptor-ref name="LLAction"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

运行结果:直接拼接项目/Action名字.action无法访问,当注册登录可以访问

直接访问返回登录页面

 

猜你喜欢

转载自blog.csdn.net/JayVergil/article/details/82153639