Struts2:使用Struts2实现简单的权限校验

案例描述:

使用Struts2实现权限拦截,未登录用户不可以访问后台管理页面,用户已登录则显示后台管理页面。

  1. 新建Web Project,并配置Struts2相关环境
  2. 新建后台管理页面manager.jsp

为了安全manager.jsp所在位置为/WEB-INF/page/

  1. 新建用户登录页面login.jsp
<body>
    <h2>用户登录</h2>
    ${loginError }
    <form action="login.action" method="POST">
        用户名:<input type="text" name="username"> 
        密码:<input type="password" name="password"> 
           <input type="submit" value="登录">
    </form>
</body>
  1. 配置struts.xml
<action name="login" class="LoginAction" method="login">
            <result name="success">/WEB-INF/page/manager.jsp</result>
            <result name="error">/login.jsp</result>
</action>
  1. 增加LoginAction.java,实现其login()方法
    public class LoginAction extends ActionSupport implements SessionAware {
    private String username;
    private String password;
    private Map<String, Object> session;

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    // 处理登录请求
    public String login() {
        if ("admin".equals(username) && "123".equals(password)) {
            session.put("logininfo ", username);
            return SUCCESS;
        } else {
            session.put("loginError", "用户名或密码不正确!");
            return ERROR;
        }
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Map<String, Object> getSession() {
        return session;
    }
}

上述代码已经可以实现跳转,但没有使用拦截器,下面实现自定义拦截器

  1. 实现自定义拦截器
public class AuthInterceptor extends AbstractInterceptor {
   
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
       //判断用户是否已经登录,从session中获取用户信息
        ActionContext context = ActionContext.getContext();
        Map<String,Object> session = context.getSession();
        if(session.get("LoginInfo")!=null){
            String result = invocation.invoke();
            return result;
        }else{
            return "login";
        }
    }
}
  1. struts.xml中配置拦截器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
    <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
        <!-- 1/3  注册拦截器 -->
        <interceptors>
            <interceptor name="auth" class="AuthInterceptor"></interceptor>
            <!-- 2/3  自定义拦截器栈myStack -->
            <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="auth"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 通过此Action访问后台管理页面 -->
        <action name="auth">
            <result>/WEB-INF/page/manager.jsp</result>
            <result name="login">/login.jsp</result>
            <!-- 3/3 引用自定义的拦截器栈 -->
            <interceptor-ref name="myStack"></interceptor-ref>
        </action>
        <action name="login" class="LoginAction" method="login">
            <result name="success">/WEB-INF/page/manager.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
    </package>
</struts>

当用户自定义拦截器之后,默认的拦截器将不再起作用,所以使用拦截器栈来包含defaultStack

  1. 访问http://127.0.0.1:8080/struts-authInterceptor/login.jsp
    使用"admin"和"123"登录

标签: Java, Struts2, 拦截器, interceptor

相关文章推荐: