struts框架之拦截器

原创 2018年04月16日 21:08:14

自定义拦截器

自定义拦截器方式一

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

public class MyIntercept1 implements Interceptor{

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

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

    }
}

自定义拦截器方式二

继承AbstractInterceptor类
public class MyIntercept2 extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

自定义拦截器方式三

public class MyIntercept3 extends MethodFilterInterceptor{
    // 拦截方法
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // 前处理
        System.out.println("前处理");
        // 放行方法
        // 所有拦截器都执行完毕后 
        // 会拿到一个字符串
        // 这个字符串就是 action类 执行完毕后 返回的字符串
        String result = invocation.invoke();
        // 后处理
        System.out.println("后处理");
        return result;
    }
}

测试

import com.opensymphony.xwork2.ActionSupport;
/*
 * 配置自定义拦截器
 * 可以指定 拦截或不拦截哪些方法
 */
public class Demo01Action extends ActionSupport{
    public String add() {
        System.out.println("add");
        return "success";
    }
    public String update() {
        System.out.println("update");
        return "success";
    }
    public String find() {
        System.out.println("find");
        return "success";
    }
    public String delete() {
        System.out.println("delete");
        return "success";
    }
}
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="inter" namespace="/" extends="struts-default">
        <!-- 1.注册拦截器 -->
        <interceptors>
            <!-- 注册你自己定义的拦截器 -->
            <interceptor name="MyIntercept3" class="com.lanou3g.intercept.MyIntercept3"></interceptor>
            <!-- 2.注册拦截器栈 -->
            <interceptor-stack name="MyStack">
                <interceptor-ref name="MyIntercept3">
                    <!-- 设置不想拦截的方法 逗号隔开多个方法 -->
                    <param name="includeMethods">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">/1.jsp</result>
        </action>
    </package>
</struts>

小项目之部分代码

struts.xml

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

        <interceptors>
            <interceptor name="MyIntercept" class="com.lanou3g.web.MyInterceptor"></interceptor>
            <interceptor-stack name="MyStack">
                <interceptor-ref name="MyIntercept">
                    <!-- 设置不拦截登录 方法 -->
                    <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>
    </package>
</struts>

UserAction

public class UserAction extends ActionSupport implements ModelDriven<User>{
    // 使用模型驱动
    private User u = new User();
    // 声明service
    private UserService service = new UserServiceImpl();
    // 声明登录的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;
    }
}

MyInterceptor

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();
          }
    }
}

UserServiceImpl

public class UserServiceImpl implements UserService {
    // 声明dao层对象
    private UserDao dao = new UserDaoImpl();
    @Override
    public User login(User u) {
        // 开启事物
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 调用dao层方法
        User findU = dao.findUser(u);
        // 提交事物
        transaction.commit();
        // 处理逻辑 要在提交事物之后来写(事物中间只调dao层的方法)
        // 分别提示用户名和密码错误
        // 只根据名字 查询用户 如果查询出用户(这里包含着用户的所有信息)
        // 再比对 用户的密码是否正确
        if (findU == null) {
            // 没有这个用户 使用异常处理
            throw new RuntimeException("该用户不存在");
        }
        // 有这个用户
        if (!findU.getUser_password().equals(u.getUser_password())) {
            // 密码不正确
            throw new RuntimeException("密码不正确");
        }
        // 返回查询的对象
        return findU;
    }
}

UserDaoImpl

public class UserDaoImpl implements UserDao {
    @Override
    public User findUser(User u) {
        Session session = HibernateUtils.getCurrentSession();
        String hql = "from User where user_code=?";
        Query query = session.createQuery(hql);
        query.setParameter(0, u.getUser_code());
        // 预见查询结果
        User findU = (User) query.uniqueResult();
        return findU;
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>sh-struts</display-name>
 <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>  
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

login.jsp

<HEAD>
<script type="text/javascript">
    // 窗口加载
    window.onload=function(){
        // 如果是在框架中
        if(window.parent != window){
            //就让框架页面跳转到登陆页面
            window.parent.location.href = "${pageContext.request.contextPath}/login.jsp";
        }
    };
</script>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liurongsheng123/article/details/79966576

Microsoft Windows 2000 应用程序兼容性

Microsoft Windows 2000 应用程序兼容性作者:Kyle Marsh Microsoft Corporation 1999 年 11 月 摘要:讨论使应用程序在 Microsoft(...
  • Drate
  • Drate
  • 2002-09-24 09:32:00
  • 1584

struts中自定义validator验证

struts中自定义validator验证很多时候需要验证“密码”与“重复密码”是否一致,如果放在服务器端验证就浪费资源了。如何在客户端进行验证呢?JS可以实现,但是struts的validator框...
  • qing2005
  • qing2005
  • 2007-08-24 14:34:00
  • 1496

在struts中使用Validator框架

Validator验证框架 Validatro框架以成为Jakarta的公共项目的一部分,可以从http://jakarta.apache.org/commons/下载单独的Validator框架,在...
  • lenhan12345
  • lenhan12345
  • 2007-04-13 11:22:00
  • 712

Struts2框架8.拦截器介绍

什么是拦截器?   interceptor拦截器类似于过滤器,是可以再Action执行前后执行的代码。是我们做web开发时经常用的技术。比如:权限控制、日志控制等。我们可以讲多个interceptor...
  • gxy1317
  • gxy1317
  • 2016-08-20 00:29:47
  • 429

Struts2框架学习之六:理解并使用拦截器

前言拦截器是Struts2框架的核心功能,理解并使用拦截器有助于更灵活使用Struts2。拦截器与Servlet中的过滤器有些类似却又不尽相同。因为在Struts2中拦截器更像一个可插拔的组件,围绕A...
  • u011116672
  • u011116672
  • 2015-12-22 18:28:51
  • 1402

【Struts】:Interceptors(拦截器)

拦截器体系是Struts2框架的重要组成部分,Struts2 中提供的很多特性都是通过拦截实现的,例如异常处理,文件上传,生命周期回调与验证。拦截器从概念上来讲和Servlet 过滤器或者 JDK 的...
  • u010929604
  • u010929604
  • 2016-04-30 21:53:37
  • 794

【Struts2框架】第六节拦截器-拦截器介绍和总结

一.拦截器概念 Strrurs拦截器是可插拔式的拦截器:如果我们要使用某个拦截器,只需要在配置文件中应用该拦截器即可。 Struts拦截器由struts-default.xml,struts.xml...
  • u013517797
  • u013517797
  • 2015-07-27 16:09:33
  • 1448

仿struts2框架自己写的代码

  • 2010年04月02日 20:05
  • 12KB
  • 下载

Struts框架学习之拦截器

为什么用拦截器? Struts是基于mvc模式的开发框架。任何框架,都会预先实现一部分功能。struts框架自带功能的实现,是通过一个个拦截器完成的。 Struts早起版本中,核心功能是通过一个类...
  • ning_xian_hong
  • ning_xian_hong
  • 2015-06-08 17:03:46
  • 655

struts框架入门的第一小程序

struts框架入门的第一小程序专门提供给新入门者写第一struts程序: java代码 /** * struts第一个程序hello world * 1.选择发布方式G:\higher * c...
  • yzt_Roar
  • yzt_Roar
  • 2016-10-10 21:57:29
  • 290
收藏助手
不良信息举报
您举报文章:struts框架之拦截器
举报原因:
原因补充:

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