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

通过Struts2拦截器实现Session失效后自动跳转到登录页面逻辑

程序员文章站 2022-03-03 16:16:42
...

Session的默认失效时间是30分钟。当系统空置时长超过30分钟时,如果未做对应的处理,访问出错。在这里的处理是,当Session失效之后,用户再次访问的时,自动跳转到登录页面。

参考文章:

《Struts2自定义拦截器实例-登录权限验证》--https://blog.csdn.net/java_cxrs/article/details/5514340

《Struts2自定义拦截器实例-Session超时的处理》--https://blog.csdn.net/java_cxrs/article/details/5519743

  --Login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>用户登录</title>
  <link rel="stylesheet" type="text/css" href="css/common.css">
  <script src="js/jquery-3.2.1.js"></script>
  <script src="js/jquery.validate.js"></script>
  <!--从iframe中跳转-->
  <script type="text/javascript">
      if (window != top){
          top.location.href = location.href;
      }
  </script>
</head>
<body style="background-color:#003d79">
    <s:form id="loginFrom" theme="simple" method="post" action="login">
      <div id="loginDiv">
        <div style="padding-top: 30px;">
          <s:textfield id="username" name ="user.username" placeholder="请输入用户名" class="loginTextfield"/>
        </div>
        <div style="padding-top: 30px;">
          <s:password id="password" name="user.password" placeholder="请输入密码" class="loginTextfield"/>
        </div>
        <div style="padding-top: 20px;">
          <s:submit class="loginBtnStyle" value="登   录"/>
        </div>
      </div>
    </s:form>
</body>
</html>

--LoginAction

package action;

import bean.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import common.CommonParam;
import service.LoginService;
import serviceImpl.LoginServiceImpl;
import java.util.Map;

public class LoginAction extends ActionSupport{


    //定义User对象
    private User user;
    //定义loginService对象
    private LoginService loginService;

    /**
     * 登录验证
     * @return String
     */
    public String userLogin(){
        String result = "";
        //定义用户列表
        User loginUser = new User();
        loginUser = loginService.getUserByUserName(user);
        if(loginUser != null) {
            if (user.getUsername().equals(loginUser.getUsername())) {
                if (user.getPassword().equals(loginUser.getPassword())) {   //如果用户名和密码一致
                    if (loginUser.getIsDelete() == CommonParam.USER_ENABLE) {
                        //获取session
                        ActionContext actionContext = ActionContext.getContext();
                        Map session = actionContext.getSession();
                        //保存信息到session
                        session.put("userId", loginUser.getUserId());
                        session.put("userName", loginUser.getUsername());
                        session.put("userRole", loginUser.getRoleId());

                        result = SUCCESS;
                        return result;
                    } else {
                        addFieldError("loginFail", "用户已禁用,请联系管理员");
                        result = "failure";
                        return result;
                    }
                } else {
                    addFieldError("loginFail", "用户名和密码不对应,请检查");
                    result = "failure";
                    return result;
                }
            }
        }else {
            addFieldError("loginFail", "该用户不存在,请联系管理员");
            result = "failure";
            return result;
        }
        return result;
    }

/**---------------------------getter and setter-------------------------*/
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public LoginService getLoginService() {
        return loginService;
    }

    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }
}

--自定义过滤器类

package common;

import action.LoginAction;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.Action;
import java.util.Map;

public class MySessionInterceptor extends AbstractInterceptor{

    public String intercept(ActionInvocation ai) throws Exception {
        //获取上下文
        ActionContext context = ai.getInvocationContext();
        //获取session
        Map session = context.getSession();
        //获取action
        Action action =(Action)ai.getAction();
        //如果是登录
        if(action instanceof LoginAction){
            return ai.invoke();
        }
        //获取session中的userName的值
        String username = (String)session.get("userName");
        
        if(username == null){
            return Action.LOGIN;  //return "login"
        }else {
            return  ai.invoke();
        }
    }
}

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>

    <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
    <include file="struts-default.xml"></include>

    <package name="default" extends="struts-default,json-default">
        <!--定义一个拦截器-->
        <interceptors>
            <interceptor name="sessionOut" class="common.MySessionInterceptor"/>
            <!--拦截器栈-->
            <interceptor-stack name="myInterceptor">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="sessionOut"/>
            </interceptor-stack>
        </interceptors>

        <!--定义全局result-->
        <global-results>
            <result name="login">/Login.jsp</result>
        </global-results>


        <!--登录相关action-->
        <action name="login" class="action.LoginAction" method="userLogin">
            <result name="success" type="redirect">/jsp/homePage.jsp</result>
            <result name="failure">/Login.jsp</result>
        </action>

        <!--角色相关action-->
        <!--获取角色列表数据-->
        <action name="role" class="action.RoleAction" method="getRoleList">
            <result name="success">/jsp/roleList.jsp</result>
            <result name="failure">/jsp/roleList.jsp</result>
            <interceptor-ref name="myInterceptor"/>
        </action>
        <!--添加角色-->
        <action name="addRole" class="action.RoleAction" method="addRole">
            <result name="success" type="redirect">role.action</result>
            <result name="failure">/jsp/error.jsp</result>
            <result name="input">/jsp/addRole.jsp</result>
            <interceptor-ref name="myInterceptor"/>
        </action>
    </package>
</struts>
相关标签: 解决方案