【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

一、概述

项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高。但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB引用的空指针异常,造成数据错误,程序崩溃。因此需要一种机制保障每次发送请求执行Action中的方法之前校验用户是否处于登录状态。
针对上述分析,可以选用两种实现方式。
AOP
AOP思想可以在任意方法执行前进行拦截,完成原始方法执行前的操作
Struts2拦截器
Struts2拦截器可以再Struts2的任意Action执行之前和之后,完成某些任务,其内部工作原理与AOP极其相似。

二、拦截器实现

2.1、拦截器实现类

package org.sihai.qualitycontrol.util.interceptor;

import org.sihai.qualitycontrol.auth.emp.vo.EmpModel;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor{

    public String intercept(ActionInvocation invocation) throws Exception {
        //执行除了登录操作之前的所有操作做登录校验
        //获取本次操作的信息
        /*
        System.out.println(invocation.getProxy().getAction());
        System.out.println(invocation.getProxy().getActionName());      emp_login
        System.out.println(invocation.getProxy().getMethod());
        */
        String actionName = invocation.getProxy().getAction().getClass().getName();
        String methodName = invocation.getProxy().getMethod();
        String allName = actionName+"."+methodName;

        if("org.sihai.qualitycontrol.auth.emp.web.EmpAction.login".equals(allName)){
            return invocation.invoke();
        }

        //解决登录嵌套的问题
//      System.out.println(invocation.getProxy().getActionName()+"---"+invocation.getProxy().getAction().getClass().getName());
        if(invocation.getProxy().getActionName().equals("page_login")){
            return invocation.invoke();
        }

        //获取当前登录人信息
        EmpModel loginEm = (EmpModel) ActionContext.getContext().getSession().get(EmpModel.EMP_LOGIN_USER_OBJECT_NAME);
        //如果当前没有登录,跳转到登录页面
        if(loginEm == null){
            //跳转到登录
            return "noLogin";
        }

        //执行原始操作
        return invocation.invoke();
    }


}

这里需要判断三个问题:
1、如果是登录方法,放行。
2、解决登录嵌套的问题
3、获取当前登录人的信息,判断是否有权限

2.2、拦截器配置

        <interceptors>
            <interceptor name="loginInterceptor" class="org.sihai.qualitycontrol.util.interceptor.LoginInterceptor"/>


            <interceptor-stack name="systemStack">
                <interceptor-ref name="loginInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

        </interceptors>

        <default-interceptor-ref name="systemStack"/>

这样就可以拦截非法的用户了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hello-java-maker

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

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

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

打赏作者

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

抵扣说明:

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

余额充值