Struts2【拦截器】(二)

拦截器应用案例


需求:当用户登陆成功,跳转到显示用户的JSP页面中。当用户登陆失败,重新返回登陆界面。如果用户直接访问显示用户的JSP页面,那么返回到登陆界面

Struts2【拦截器】(二)这里写图片描述


分析


实现这个需求,我们可以使用过滤器的。只要获取用户的请求URL,再判断URL是不是为list.jsp,如果是,我们返回到登陆的界面就好了。


现在,为了对拦截器的理解,我们使用拦截器去完成这个功能!



搭建配置环境


  • 导入我们c3p0.xml文件
  • 导入c3p0开发包
  • 导入mysql开发包
  • 写数据库连接池工具类
  • dbUtils开发包
  • 8个struts2需要用到的开发包

Struts2【拦截器】(二)这里写图片描述

  • 创建数据库表,导入数据

Struts2【拦截器】(二)这里写图片描述

编写entity


package zhongfucheng.entity;
/**
 * Created by ozc on 2017/5/3.
 */
public class User {
    private String id ;
    private String username;
    private String cellphone;
    private String email;
    private String password;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getCellphone() {
        return cellphone;
    }
    public void setCellphone(String cellphone) {
        this.cellphone = cellphone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}


编写DAO


package zhongfucheng.dao;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import zhongfucheng.entity.User;
import zhongfucheng.utils.Utils2DB;
import java.sql.SQLException;
import java.util.List;
/**
 * Created by ozc on 2017/5/3.
 */
public class UserDao {
    public User login(User user) {
        try {
            String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
            return (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{user.getUsername(), user.getPassword()});
        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
        return null;
    }
    public List<User> getAll() {
        try {
            String sql = "SELECT * FROM user";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
            return (List<User>) queryRunner.query(sql, new BeanListHandler(User.class));
        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
        return null;
    }
}


编写Service


public class Service {
    UserDao userDao = new UserDao();
    public User login(User user) {
        return userDao.login(user);
    }
    public List<User> getAll() {
        return userDao.getAll();
    }
}


编写登陆的JSP页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user_login" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="submit" value="登陆"><br>
</form>
</body>
</html>


编写处理请求的Action


package zhongfucheng.action;
import com.opensymphony.xwork2.ActionContext;
import zhongfucheng.entity.User;
import zhongfucheng.service.Service;
import java.util.List;
import java.util.Map;
/**
 * Created by ozc on 2017/5/3.
 */
public class UserAction {
    /****************1.封装数据********************/
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    /***************2.调用Service*******************/
    Service service = new Service();
    //登陆
    public String login() {
        User user = service.login(this.user);
        if (user == null) {
            return "input";
        } else {
            //将user的信息存到Session域对象中
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("user", user);
            //登陆成功
            return "login";
        }
    }
    //查看user信息
    public String list() {
        //拿到所有用户的信息
        List<User> users = service.getAll();
        //存到request域对象中
        Map<String, Object> request = ActionContext.getContext().getContextMap();
        request.put("users", users);
        return "list";
    }
}


struts.xml配置文件


<package name="xxx" extends="struts-default" >
        <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}" >
            <!--如果登陆成功,重定向到Action中,执行list业务方法-->
            <result name="login" type="redirectAction">user_list</result>
            <!--如果是list,那么跳转到list.jsp页面-->
            <result name="list" >/WEB-INF/list.jsp</result>
        </action>
    </package>



到目前为止,我们登陆或者不登陆都可以得到用户的具体信息….这是不合理的


我们想要的效果是:只有用户正在调用login方法,或者该用户已经登陆了,才可以查看具体的用户信息


因此,我们们要拦截它们,只有用户调用的是login方法时或者已经登陆的情况下,才能跳转到对应的显示页面



拦截器


package zhongfucheng;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 * Created by ozc on 2017/5/3.
 */
public class Interceptor  extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        //得到正在执行的代理对象
        ActionProxy proxy = actionInvocation.getProxy();
        //通过代理对象得到正在执行的方法
        String method = proxy.getMethod();
        //如果方法的名字不是login,那么就让他们返回到login页面上
        if (!method.equals("login")) {
            //查看用户是否登陆了
            Object user = ActionContext.getContext().getSession().get("user");
            //如果没有登陆,回到login页面
            if (user == null) {
                return "input";
            } else {
                //登陆了,那么就让它访问具体的用户信息页面
                return actionInvocation.invoke();
            }
        } else {
            //如果是访问login方法,那么就让它执行
            return actionInvocation.invoke();
        }
    }
}


Struts.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="xxx" extends="struts-default">
        <interceptors>
            <!--配置自定义的拦截器-->
            <interceptor name="Interceptor1" class="zhongfucheng.Interceptor"/>
            <!--配置拦截器栈,把默认的拦截器栈都加载自定义的拦截器栈中-->
            <interceptor-stack name="myStack">
                <interceptor-ref name="Interceptor1"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <!--让Struts执行拦截器-->
        <!--【执行拦截器:第一种写法: 当前包下所有的acntion都执行myStack栈】-->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        <!--第二种写法: 只是在这一个Action中执行myStack栈
        <interceptor-ref name="defaultStackt"></interceptor-ref>
        <interceptor-ref name="loginCheck"></interceptor-ref>
        -->
        <!-- 第三种写法:执行用户栈(与第二种写法一样, 只在当前aciton中执行自定义栈) -->
        <!-- <interceptor-ref name="myStack"></interceptor-ref>-->
        <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}">
            <!--如果登陆成功,重定向到Action中,执行list业务方法-->
            <result name="login" type="redirectAction">user_list</result>
            <!--如果是list,那么跳转到list.jsp页面-->
            <result name="list">/WEB-INF/list.jsp</result>
            <!--如果是直接访问Action或者没有用户登陆,返回login页面-->
            <result name="input">/login.jsp</result>
        </action>
    </package>
</struts>


效果:


只有当用户登陆了才能查看用户具体信息,直接访问Action会跳转回


Struts2【拦截器】(二)这里写图片描述

上一篇:Hibernate【映射】知识要点(二)


下一篇:Oracle创建用户,创建表空间,将空间分配给用户,给用户授权