在struts2.1中使用注解和拦截器实现权限细粒度控制

在struts2.1中使用注解和拦截器实现权限细粒度控制

正如上一篇文章说的,拦截器是struts2的核心,同时struts2引入了注解的方式。这里就来简单看看针对struts2.1中使用注解和拦截器的开发。
首先要引入struts2.1各包,特别要引入Convention Plugin插件。

本文只是一个简单模拟,因此我们新建两个jsp文件,分别为登录和退出。
login.jsp

< %@ page language="java"  pageEncoding="GB18030"%>

< %
pageContext.getSession().setAttribute("user","huashui");
pageContext.getSession().setAttribute("rights","TEST_AUTH");
%>
登录成功

logout.jsp

< %@ page language="java" pageEncoding="GB18030"%>

< %
pageContext.getSession().removeAttribute("user");
pageContext.getSession().removeAttribute("rights");
%>
退出成功

index.jsp

< %@ page language="java" pageEncoding="GB18030"%>
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
        <head>
                <title>主页</title>
        </head>
        <body>
                <p>
                        ${tip }
                </p>
                <a href="login.jsp">登录</a>
                <br />
                <a href="logout.jsp">退出</a>
                <br />
                <a href="admin/test.action">权限页面</a>
        </body>
</html>

建好了这三个页面后,我们开始来写注解。

package org.huashui.authentication;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *@author Huashui
 *@blog http://huashui.org
 */
@Retention(RetentionPolicy.RUNTIME)//指定该注解是在运行期进行
@Target({ElementType.METHOD})//指定该注解要在方法上使用
public @interface AuthName {
         String value() default "";

}

注解本身不能起作用,注解起作用关键在于后台有一个解析器。接下来来写下这个解析器。

package org.huashui.authentication;

import java.lang.reflect.Method;

/**
 * @author huashui
 * @blog http://huashui.org
 */
public class ParseAuthName {
        public static String parseAuthentication(Class< ?> clazz, String methodName,
                        Class< ?>... parameterTypes) throws NoSuchMethodException {
                //根据方法名,取得方法,如果有则返回
                Method method = clazz.getMethod(methodName, parameterTypes);

                if (null != method) {
                        AuthName authName = method.getAnnotation(AuthName.class);
                        if (null != authName) {
                                return authName.value();
                        }
                }

                return null;
        }
}

接下来书写拦截器

package org.huashui.interceptor;

import org.huashui.authentication.ParseAuthName;

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

/**
 * @authorhuashui
 * @blog http://huashui.org
 */
@SuppressWarnings("serial")
public class AuthInterceptor extends AbstractInterceptor {

        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
                ActionContext context = invocation.getInvocationContext();
                String user = (String) context.getSession().get("user");
                String rights = (String) context.getSession().get("rights");
                if (null != user) {
                        ActionProxy proxy = invocation.getProxy();
                        String methodName = proxy.getMethod();
                        Object action = proxy.getAction();
                        String auth = null;
                        try {
                                auth = ParseAuthName.parseAuthentication(action.getClass(),
                                                methodName, null);

                        } catch (NoSuchMethodException e) {
                                e.printStackTrace();
                                ActionContext.getContext().put("tip", "没有权限");
                                return Action.LOGIN;
                        }

                        if (null != auth) {
                                if ("TEST_AUTH".equals(auth)) {
                                        return invocation.invoke();
                                }
                        }
                        ActionContext.getContext().put("tip", "没有权限");
                        return Action.LOGIN;
                } else {
                        ActionContext.getContext().put("tip", "没有登录");
                        return Action.LOGIN;
                }

        }

}

接下来配置下拦截器

< ?xml version="1.0" encoding="UTF-8" ?>
< !DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
        <package name="huashui-default" namespace="/admin"
                extends="struts-default">
                <interceptors>
                        <interceptor name="auth"
                                class="org.huashui.interceptor.AuthInterceptor">
                        </interceptor>
                        <interceptor -stack name="authdefault">
                                </interceptor><interceptor -ref name="defaultStack"></interceptor>
                                <interceptor -ref name="auth"></interceptor>

                </interceptors>
                <default -interceptor-ref name="authdefault"></default>
        </package>
</struts>

配好这些后,我们开始写Action进行测试

package org.huashui.action;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.huashui.authentication.AuthName;

/**
 * @author 曾华水
 * @email email@huashui.org
 */
@ParentPackage("huashui-default")
@Namespace("/admin")
public class UserListAction {

        @AuthName(value = "TEST_AUTH")
        @Action(value = "test", results = {
                        @Result(name = "success", location = "/WEB-INF/content/success.jsp"),
                        @Result(name = "login", location = "/index.jsp")

        })
        public String execute() {
                return com.opensymphony.xwork2.Action.SUCCESS;
        }

}

完成。

摘自:http://www.mrzeng.com/post/struts2-1-annotations-interceptor-authentication.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值