Struts拦截器-配置及简单应用示例-ssh项目

本文简单记录ssh项目中拦截器的应用:只有登录的用户才可以访问后台链接。未登录用户直接访问其他后台链接将被拦截到登录页面进行登录。就像逛某宝网站,未登录可以浏览商品,但是购买下单,或者收藏订阅,都会提示先登录才能进行那些操作。

项目源代码可以到我的资源下载 —ssh项目(练习)


第一步:编写一个普通类实现interceptor接口,并实现接口的所有方法

public class LoginInterceptor implements Interceptor{
    @Override
    public void destroy() {  
        //拦截器销毁方法
    }
    @Override
    public void init() {
        //拦截器初始化方法
    }
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        //具体对拦截到的方法进行的操作在此方法写
    }
}

第二步:在struts的核心配置文件struts.xml中配置拦截器

<?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>
        <!-- 配置开发模式 -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- struts2的核心配置文件自动重修加载 -->
        <constant name="struts.configuration.xml.reload" value="true"></constant>

        <package name="sys" namespace="/" extends="struts-default">
            <!-- 主要这一块================【start】============================== -->
            <interceptors>
                <!-- 声明自定义拦截器 -->
            <interceptor name="loginInterceptor" class="org.kuwei.interceptor.LoginInterceptor">
                    <!-- 声明不需要(或需要)拦截的方法 个人认为声明不需要拦截的比较方便 多个方法名以逗号分隔即可 -->
                    <param name="notIncludeMethods">ckLogin</param>
                </interceptor>
                <!-- 声明自定义拦截器栈 -->
                <interceptor-stack name="loginStack">
                    <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 必须引用struts默认的拦截器栈 -->
                    <interceptor-ref name="loginInterceptor"></interceptor-ref> <!-- 引用自定义的拦截器 -->
                </interceptor-stack>
            </interceptors>
            <!-- 主要这一块=================【end】============================= -->
            <action name="nurse-*" class="org.kuwei.action.NurseAction" method="{1}">
                <!-- 
                    访问此action中的方法都会被拦截判断,根据需要进行其他操作
                 -->
                <interceptor-ref name="loginStack"></interceptor-ref>  <!-- 引用自定义的拦截器 -->
                <result name="list">/WEB-INF/view/emp_list.jsp</result>
                <result name="add">/WEB-INF/view/emp_add.jsp</result>
                <result name="update">/WEB-INF/view/emp_update.jsp</result>
                <result name="login">/index.jsp</result>
                <result name="success" type="redirectAction">nurse-list</result>
            </action>
        </package>
    </struts>

第三步:编写自定义拦截器中具体要执行的操作

package org.kuwei.interceptor;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.kuwei.dto.Nurse;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 功能:登录拦截器
 * @kuwei 2017年5月2日下午7:39:30
 */
@SuppressWarnings("serial")
public class LoginInterceptor implements Interceptor{
    //此变量是struts.xml中定义的不需要拦截的方法以逗号拼接的字符串
    //提供get 和 set方法之后可以自动取到struts.xml文件中定义的值
    private String notIncludeMethods;

    @Override
    public void destroy() {

    }

    @Override
    public void init() {

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
//      获取触发拦截器的方法(也就是当前地址栏访问的方法的方法名)
        String method = invocation.getProxy().getMethod();
        //将不需要拦截的方法字符串拆分成数组
        String[] no = notIncludeMethods.split(",");
        /*
            定义一个集合,存放数组中的值。因为要用list的contains方法
            判断此字符串是否包含在list集合中
            数组并没有这样方便的方法,所以新建集合存放数组的值
        */
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < no.length; i++) {
            list.add(no[i]);
        }
        HttpSession session = ServletActionContext.getRequest().getSession();
        Nurse nurse = (Nurse) session.getAttribute("nurse");
        if(list.contains(method)){  //方法包含在notIncludeMethods中不需要拦截
            return invocation.invoke(); //放行
        }else{  //可能需要拦截
            if(nurse!=null){    //已登录,不需要拦截
                return invocation.invoke(); //放行
            }else{
                session.setAttribute("err_msg", "非法访问!请先登录");
                return "login";     //未登录,需要拦截  去登录页面
            }
        }
    }
    //getters and setters
    public String getNotIncludeMethods() {
        return notIncludeMethods;
    }

    public void setNotIncludeMethods(String notIncludeMethods) {
        this.notIncludeMethods = notIncludeMethods;
    }

}

学习的过程也是不断忘记的过程,随手记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fool_dawei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值