Java之struts2自定义拦截器

原创 2018年04月16日 20:31:59

struts2自定义拦截器

拦截器生命周期:
    随着程序的开始而创建,随着程序的结束而销毁
    (不可能每个访问都创建一个拦截器)

方式一

实现Interceptor接口

public class MyInterceptor1 implements Interceptor{
    // 生命周期方法
    // 拦截器初始化方法
    @Override
    public void init() {

    }
    // 拦截方法
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        return null;
    }
    // 销毁方法
    @Override
    public void destroy() {

    }
}

方式二

继承AbstractInterceptor

public class MyInterceptor2 extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        return null;
    }

}

方式三(使用这种)

继承MethodFilterInterceptor(方法过滤拦截器)

public class MyInterceptor3 extends MethodFilterInterceptor{
    // 拦截方法
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // 前处理
        System.out.println("前处理");

        <!--放行方法-->
        <!--所有拦截器都执行完毕后 会拿到一个字符串-->
        <!--这个字符串就是action类 执行完毕后返回的字符串-->
        String result = invocation.invoke();

        // 后处理
        System.out.println("后处理");
        return result;
    }

}

Action类

public class Demo01Action extends ActionSupport{

    public String add() {
        System.out.println("add");
        return "success";
    }
    public String delete() {
        System.out.println("delete");
        return "success";
    }
    public String update() {
        System.out.println("update");
        return "success";
    }
    public String find() {
        System.out.println("find");
        return "success";
    }
}

struts.xml
配置自定义拦截器(配置信息参考struts-default.xml)

<struts>
    <package name="inter" namespace="/" extends="struts-default">
        <!-- 1.注册拦截器 -->
        <interceptors>
            <!-- 注册自己定义的拦截器 -->
            <interceptor name="MyInterceptor3" class="com.lanou3g.intercept.MyInterceptor3"></interceptor>
            <!-- 2.注册拦截器栈 -->
            <interceptor-stack name="myStack">
                <!-- 引入拦截器 -->
                <interceptor-ref name="MyInterceptor3">
                    <!-- 
                        设置不想拦截的方法 逗号隔开多个方法
                        includeMethods表示设置想拦截的方法
                    -->
                    <param name="excludeMethods">add,update</param>
                </interceptor-ref>
                <!-- 除了引用自己的拦截器 还要使用系统默认拦截器 -->
                <!-- 
                    建议:先放自己的拦截器 再放系统的拦截器
                    自己写的拦截器 可能会用到系统的拦截器封装好的功能
                 -->
                 <!-- 引入系统默认的拦截器栈 -->
                 <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 3.设置默认拦截器栈是哪个 -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>


        <action name="Demo01Action_*" class="com.lanou3g.intercept.Demo01Action" method="{1}">
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

自定义拦截器实现登录检查

创建自定义拦截器

public class MyInterceptor extends MethodFilterInterceptor{

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {

        // 根据session域中 是否存放了User对象
        // 来判断 用户是否登录了
        Object object = ActionContext.getContext().getSession().get("user");
        if (object == null) {
            // 没登录 重定向到登录页面
            return "toLogin";
        } else {
            // 登录了放行
            return invocation.invoke();
        }
    }
}

Action类

public class UserAction extends ActionSupport implements ModelDriven<User>{
    // 声明一个service
    private UserService service = new UserServiceImpl();

    // 使用模型驱动
    private User u = new User();

    // 声明登录的action方法
    public String login() {
        System.out.println(u);

        // 调用service方法
        User findU = service.login(u);
        // 保存到session域中(登录状态)
        ActionContext.getContext().getSession().put("user", findU);

        // 表示重定向回首页
        return "toIndex";
    }

    @Override
    public User getModel() {
        return u;
    }

}

service层

    <!--
        只根据名字查询用户 如果查询出用户(这里包含着用户所有信息)
        再比对用户的密码是否正确
    -->
    if (findU == null) {
        // 没有这个用户 使用异常处理
        throw new RuntimeException("用户不存在");
    }
    if (!findU.getUser_password().equals(u.getUser_password())) {
        // 密码不正确
        throw new RuntimeException("密码不正确");
    }
    // 返回查询的对象
    return findU;

login.jsp

    <!-- 引入struts标签库 -->
    <%@ taglib uri="/struts-tags" prefix="s" %>

    <!-- 显示错误信息 -->
    <!-- 获取异常信息 message
    相当于调用了getMessage()方法 -->
    <font color="red">
        <s:property value="exception.message"/>
    </font>


    <!-- 查看值栈标签 -->
    <s:debug></s:debug>

struts.xml配置

<struts>
    <package name="web" namespace="/" extends="struts-default">
        <interceptors>
            <interceptor name="MyInterceptor" class="com.lanou3g.web.MyInterceptor"></interceptor>
            <interceptor-stack name="myStack">
                <interceptor-ref name="MyInterceptor">
                    <!-- 设置不拦截登录方法 -->
                    <param name="excludeMethods">login</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="myStack"></default-interceptor-ref>      


        <!-- 设置全局的拦截器返回结果 进行跳转设置 -->
        <global-results>
            <result name="toLogin" type="redirect">/login.jsp</result>
        </global-results>


        <!-- 配置全局异常处理页面 异常的映射 -->
        <global-exception-mappings>
            <!-- exception 异常错误类型(全类名) -->
            <!-- result 出现异常返回的结果字符串 -->
            <!-- action 可以根据这个 异常的结果 跳转一个页面 -->
            <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>           
        </global-exception-mappings>


        <action name="UserAction_*" class="com.lanou3g.web.UserAction" method="{1}">
            <!-- 登录成功后 重定向回首页 -->
            <result name="toIndex" type="redirect">/index.htm</result>
            <!-- 配置一个异常处理 要跳转的页面 -->
            <result name="error">/login.jsp</result>
        </action>
    </package>
</struts>
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dzy_water/article/details/79966021

javaweb之struts2学习四---自定义拦截器

1.struts2的拦截器有三种       默认拦截器,模型驱动拦截器,自定义拦截器 2.自定义拦截器的步骤    2.1 先建立一个普通类,继承于AbstractIntercept,实现in...
  • zyp1987106
  • zyp1987106
  • 2017-11-07 00:24:21
  • 97

struts2自定义拦截器并配置拦截器使其生效

struts2自定义拦截器并配置拦截器使其生效
  • starjuly
  • starjuly
  • 2016-08-17 23:29:51
  • 3783

struts2中自定义拦截器详解

1:register.jsp String path = request.getContextPath(); String basePath = request.getScheme()...
  • pangqiandou
  • pangqiandou
  • 2016-12-03 23:10:26
  • 906

Struts2 自定义拦截器配置和使用

Struts2中的拦截器是struts2的核心功能之一,不仅提供强大的默认拦截器,还提供了一套自定义拦截器的配置方法。 简单写一下如何自定义一个拦截器并使用: 1.首先要有一个你自己定义的拦截器,实现...
  • kewen303
  • kewen303
  • 2014-02-21 16:31:26
  • 1582

Struts2 自定义拦截器实例—登陆权限验证

实现一个登陆权限验证的功能 message.jsp: message:${message } login.jsp: My JSP 'login.jsp'...
  • work201003
  • work201003
  • 2015-10-13 15:54:37
  • 790

struts2自定义拦截器注解配置方法

自定义拦截器:package com.penjing.interceptor;import javax.servlet.http.HttpServletRequest;import net.sf.js...
  • u014655269
  • u014655269
  • 2015-04-19 23:49:02
  • 1896

Struts2自定义登录验证拦截器

Controller.UserAction.java package Controller; import java.util.Map; import com.opensymphony.xwor...
  • u012997311
  • u012997311
  • 2016-01-04 14:35:07
  • 830

struts2自定义拦截器示例

struts2自定义拦截器示例及步骤解释。
  • jinhao505
  • jinhao505
  • 2014-03-02 22:13:47
  • 3131

struts自定义拦截器的三种方式

struts自定义拦截器 有三种方式: 方式一、实现Interceptor 接口 public interface Interceptor extends Serializable{ ...
  • a1659177869
  • a1659177869
  • 2015-07-02 23:15:30
  • 1079

利用struts2拦截器加自定义注解实现权限控制

今天结合Java的Annotation和Struts2进行注解拦截器权限控制。 功能需求:添加、查找、删除三个功能,添加、查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断。 操作流程如下:客...
  • paul342
  • paul342
  • 2016-05-17 15:42:42
  • 2541
收藏助手
不良信息举报
您举报文章:Java之struts2自定义拦截器
举报原因:
原因补充:

(最多只允许输入30个字)