欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

拦截器

程序员文章站 2022-06-13 20:54:17
...
拦截器执行流程:
用户tomcat服务器拦截器1拦截器2Action实例1.启动,执行所有拦截器创建2.init()执行所有初始化方法3.init()4.用户访问5.创建action实例6.拦截器intercptor(...)方法7.invoke()8.invoke()9.execute()10111213.最终服务器响应浏览器用户tomcat服务器拦截器1拦截器2Action实例拦截器执行流程时序图
启动:
创建所有拦截器、执行init()
访问:
向创建Action
再执行拦截器
最后,拦截器放行,执行execute()
Created with Raphaël 2.2.0用户Login.jspuserAction.java显示数据yesno

拦截器案例:

需求:
登录后显示列表
案例准备:
Struts的jar文件
DbUtils组件
数据库连接池/驱动包

下面来一份简单的拦截器的登录验证案例:

拦截器

  • UserAction:
import cn.jjs.entity.Admin;
import cn.jjs.service.AdminService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.List;
import java.util.Map;

public class UserAction extends ActionSupport {

    /****************1.封装请求数据***********************/
    private Admin admin;

    public Admin getAdmin() {
        return admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

    /****************2.调用的service***********************/

    private AdminService adminService = new AdminService();

    //登录
    public String login(){
        try {

            Admin userInfo = adminService.login(admin);

            //判断
            if (userInfo == null) {
                //登录失败
                return "input";
            }
            //登录成功数据保存在session中
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("userInfo", userInfo);
            //登录成功
            return "loginSuccess";
        }catch (Exception e){
            return ERROR;
        }
    }

    //列表
    public String list(){
        try {
            //查找全部
            List<Admin> adminList = adminService.getAll();
            //保存到request
            ActionContext.getContext().getContextMap().put("adminList", adminList);

            return "list";
        }catch (Exception e){
            return ERROR;
        }
    }

}

  • UserCheckInterceptor:
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class UserCheckInterceptor extends AbstractInterceptor {

    /**
     * 拦截器业务处理方法
     */
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        //拿到当前执行的方法名:判断,只有当前方法名不是login,就进行验证。

        //拿到actionContext对象
        ActionContext ac = invocation.getInvocationContext();

        //获取action的代理对象
        ActionProxy proxy = invocation.getProxy();

        //回去当前执行的方法名
        String methodName = proxy.getMethod();
        //判断
        if(!"login".equals(methodName)){
            //先获取当前登录的用户
            Object obj = ac.getSession().get("userInfo");
            if(obj == null){
                //当前用户没有登录
                return "input";
            }else{
                //当前用户有登录
                return invocation.invoke();
            }
        }else{
            //说明当前用户正在登陆
            return invocation.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>
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!--1.修改struts默认的访问后缀-->
    <constant name="struts.action.extension" value="action,do,"></constant>
    <!--2.修改xml自动重新加载-->
    <constant name="struts.configuration.xml.reload" value="true"></constant>
    <!--3.开启动态方法调用(默认不开启)-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <!--4.修改上传文件最大为30M-->
    <constant name="struts.multipart.maxSize" value="31457280"></constant>
    <package name="user" extends="struts-default">

        <!--【拦截器配置】-->
        <interceptors>
            <interceptor name="loginCheck" class="cn.jjs.interceptor.UserCheckInterceptor"></interceptor>
            <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="loginCheck"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!--【第一种方法】执行拦截器【当前包下所有action都执行myStack栈-->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        <!--全局配置-->
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <action name="user_*" class="cn.jjs.action.UserAction" method="{1}">
            <!--【第二种方法】只是在只一个action中执行myStackzhan
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="loginCheck"></interceptor-ref>
            -->
            <!--【第三种方法】与第二种相同,只在这个action中执行自定义栈-->
            <interceptor-ref name="myStack"></interceptor-ref>


            <!--1.登录失败-->
            <result name="input">/login.jsp</result>

            <!--2.登录成功-->
            <result name="loginSuccess" type="redirectAction">user_list</result>

            <!--3.列表展示-->
            <result name="list">/WEB-INF/list.jsp</result>

        </action>
    </package>

</struts>
  • list.jsp:
<%--
  Created by IntelliJ IDEA.
  User: jinshuo
  Date: 2019/7/28
  Time: 17:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>list</title>
</head>
<body>
<table align="center" border="1">
    <tr>
        <td>序号</td>
        <td>编号</td>
        <td>用户名</td>
        <td>密码</td>
    </tr>
    <%--<c:forEach--%>
    <%--用struts标签迭代数据--%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <s:iterator var="admin" value="#request.adminList" status="st">
        <tr>
            <td>
                <s:property value="#st.count"/>
            </td>
            <td>
                <s:property value="#admin.id"/>
            </td>
            <td>
                <s:property value="#admin.userName"/>
            </td>
            <td>
                <s:property value="#admin.pwd"/>
            </td>
        </tr>
    </s:iterator>
    <tr>

    </tr>
</table>
</body>
</html>

  • login.jsp:
<%--
  Created by IntelliJ IDEA.
  User: jinshuo
  Date: 2019/7/28
  Time: 17:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/user_login">
    用户名:<input type="text" name="admin.userName">
    密码:<input type="text" name="admin.pwd">
    <input type="submit" value="登录">
</form>
</body>
</html>