struts框架之拦截器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liurongsheng123/article/details/79966576

自定义拦截器

自定义拦截器方式一

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

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">
阅读更多

没有更多推荐了,返回首页