简单的利用Struts2拦截器实现权限校验

本文主要在于介绍如何利用struts2去实现权限校验,对于struts2开发环境的搭建,网上已经有很多的教程,这里就不进行一一介绍了。
关于权限校验,首先需要注意的点:
1,在web项目中,在WEB-INF文件夹中的文件,直接访问时访问不了的,我们可以通过struts2中的action去访问。
2,拦截器与action的关系,是类似递归的关系,当然实际上不是(个人的理解,做成比喻,不恰当请大牛指正。),如我们访问action中,我们先要通过拦截器,再到action,执行完成后,再通过拦截器,最后才返回我们要return的参数。
3,使用的环境:struts-2.3.24.1,eclipse-jee-mars-2-win32-x86_64,jdk 1.8
实现权限校验的步骤原理:假如在拦截器里不调用invoke方法,那么拦截器里的值会返回到Struts.xml文件中的result,假如调用invoke方法,action中的值会返回到result中,利用这种机制可以验证登录。

也就是说通过拦截器,我们拦截到来自action的返回的参数,如果检测到登录成功,我们就放行,否则,我们返回的就是其他的值。

接下来就是具体的实现:
1,web.xml的代码:
路径:WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2_study</display-name>

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

2,struts.xml代码
路径:src/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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />

<package name="default"  extends="struts-default">

    <!-- 注册拦截器 -->
    <interceptors>
          <interceptor name="gotomanageinterceptor"class="com.lbf.interceptors.GotoManageInterceptor"></interceptor>
        <!-- 自定义拦截器栈 -->
        <interceptor-stack name="mystack">
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="gotomanageinterceptor"></interceptor-ref>
        </interceptor-stack>
    </interceptors>

    <action name="gotomanage"  >
        <result name = "success">/WEB-INF/jsp/manage.jsp</result>
        <result name = "error">/login.jsp</result>
        <interceptor-ref name="mystack"></interceptor-ref>
    </action>
    <action name="login"  class = "com.lbf.struts.GotoManage">
        <result name = "success">/WEB-INF/jsp/manage.jsp</result>
        <result name = "error">/login.jsp</result>
    </action>
</package>
</struts>

3,创建登录页面login.jsp
路径:/login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>登陆页面</title>
</head>
<body>
<p><a href="index.jsp">Home</a></p>
<form action="login.action" method="get">
        <p>username: <input type="text" name="name" /></p>
        <p>password: <input type="password" name="psw" /></p>
        <p><input type = "submit"  value = "登陆">${LoginError} </p>
</form>
</body>
</html>

4,创建访问的文件(假设是后台管理页面)manage.jsp
路径:WEB-INF/jsp/manage.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>后台管理页面</title>
</head>
<body>
<p>这是后台管理页面</p>
</body>
</html>

5,创建错误页面error.jsp(这个主要是我们可以在web项目中的struts.xml配置默认的错误页面,在这里为了简单,我没有进行配置)

路径:WEB-INF/jsp/error.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>错误页面</title>
    </head>
    <body>
    <p>这是错误页面</p>
    </body>

6,创建gotomanage.action的具体实现类GotoManage.java
路径:src/com/lbf/struts/GotoManage.java

package com.lbf.struts;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class GotoManage extends ActionSupport implements SessionAware{

    private static final long serialVersionUID = 1L;
    private String name;
    private String psw;
    private Map<String, Object> session;

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

    @Override
    public String execute() throws Exception {
        if ("linbingfeng".equals(name)&&"123".equals(psw)) {
            session.put("LoginInfo", name);
            return SUCCESS;
        }else{
            session.put("LoginError", "你没有权限查看");
            return ERROR;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }

}

7,创建拦截器的具体实现类GotoManageInterceptor.java
路径:src/com/lbf/interceptors/GotoManageInterceptor.java

package com.lbf.interceptors;

import java.util.Map;

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

public class GotoManageInterceptor extends AbstractInterceptor {

    private static final long serialVersionUID = 1L;

    @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 "error";
            }
    }

}

这个项目也许还有许多需要改善的地方,有什么错误的地方,还请大家一起来交流学习,我也是一个刚刚学习struts2不久。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张飞的猪大数据

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

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

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

打赏作者

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

抵扣说明:

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

余额充值