`
Ryan200909
  • 浏览: 9329 次
社区版块
存档分类
最新评论

struts2之注解权限控制

阅读更多

struts2之注解权限控制

今天结合Java的Annotation和Struts2进行注解拦截器权限控制。

功能需求:添加、查找、删除三个功能,添加、查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断。

操作流程如下:客户未登录或登录已超时,提示“客户还没登陆或登陆已超时!!!”,终止执行,然后跳转到某页面;否则继续往下执行。

                

以下模拟案例大概实现如上需求,接下来废话少说,直接copy代码

1、项目目录结构

 

               

2、权限控制注解类Authority.java

复制代码
package com.ljq.action;

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

/**
 * 用于识别在进行action调用的时候,标注该方法调用是否需要权限控制,需要什么样的权限的注解类。
 * 
 * 该注解类一般会包括两个属性,一个是需要的权限,一个是对应的action。
 *
 * @author Administrator
 *
 */
//表示在什么级别保存该注解信息
@Retention(RetentionPolicy.RUNTIME)
//表示该注解用于什么地方
@Target(ElementType.METHOD)
public @interface Authority {
    String actionName();
    String privilege();
}
复制代码

          

3、权限拦截器类AuthorityInterceptor.java

复制代码
package com.ljq.action;

import java.lang.reflect.Method;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 用于拦截请求判断是否拥有权限的拦截器
 * 
 * @author Administrator
 *
 */
@SuppressWarnings("serial")
public class AuthorityInterceptor implements Interceptor{

    public void destroy() {
        
    }

    public void init() {
        
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        String methodName=actionInvocation.getProxy().getMethod();
        Method currentMethod=actionInvocation.getAction()
                   .getClass().getMethod(methodName, null);
        
        //1、判断客户是否登陆
        
        //从session获取当前客户信息
        Employee employee=(Employee)ServletActionContext
                    .getRequest().getSession().getAttribute("employee");
        if(employee==null){
            System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
            System.out.println("客户还没登陆或登陆已超时!!!");   
            System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            System.out.println(); 
            return "index";
        }
        
        //2、进行权限控制判断
        
        //如果该请求方法是需要进行验证的则需执行以下逻辑
        if(currentMethod.isAnnotationPresent(Authority.class)){
            //获取权限校验的注解
            Authority authority=currentMethod.getAnnotation(Authority.class);
            //获取当前请求的注解的actionName   
            String actionName=authority.actionName();
            //获取当前请求需要的权限   
            String privilege=authority.privilege();
            
            //可以在此判断当前客户是否拥有对应的权限,如果没有可以跳到指定的无权限提示页面,如果拥有则可以继续往下执行。  
            
            //if(拥有对应的权限){
            //    return actionInvocation.invoke();  
            //}else{
            //    return "无权限";  
            //}
            
            System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
            System.out.println("客户" + employee.getUserName() + "在" + new Date() + "执行了" + actionName+"方法,拥有"+privilege+"权限!!");   
            System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            System.out.println();            
            return actionInvocation.invoke();
        }
        
        //3、进行非权限控制判断
        
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
        System.out.println("我执行了没有??");    
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        return "index";
    }

}
复制代码

           

4、客户信息类Employee.java

复制代码
package com.ljq.action;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Employee implements Serializable {

    private Integer id;
    private String userName;
    private String pwd;

    public Employee() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

}
复制代码

          

5、action类EmployeeAction

复制代码
package com.ljq.action;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class EmployeeAction extends ActionSupport{

    /**
     * 添加
     * 
     * 请求该方法需要拥有对test的add权限,会通过拦截器拦截  
     * 
     * @return
     */
    @Authority(actionName="test", privilege="add")
    public String add(){
        System.out.println("执行了add方法!!!");
        return SUCCESS;
    }
    
    /**
     * 查找
     * 
     * 请求该方法的时候需要拥有对test的find权限,会通过拦截器拦截  
     * 
     * @return
     * @throws Exception
     */
    @Authority(actionName="test", privilege="find")
    public String find() throws Exception {
        System.out.println("执行了find方法!!!");
        return SUCCESS;
    }
    
    /**
     * 删除
     * 
     * 不会通过拦截器拦截,因为没对actionName进行权限配置
     * 
     * @return
     * @throws Exception
     */
    public String delete() throws Exception {
        System.out.println("执行了delete方法!!!");
        return SUCCESS;
    }

}
复制代码

     

6、首页index.jsp

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
     欢迎您的到来....    
  </body>
</html>
复制代码

           

7、登录页login.jsp

 

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.ljq.action.Employee"%>
<%
    Employee employee=new Employee();
    employee.setId(1);
    employee.setUserName("jiqinlin");
    employee.setPwd("123456");
    request.getSession().setAttribute("employee", employee);
%>

客户已经登录
复制代码

          

8、struts2配置文件

复制代码
<?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>
    <constant name="struts.serve.static.browserCache" value="false"/>
    <constant name="struts.action.extension" value="do"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <package name="base" extends="struts-default">
        <global-results>
            <result name="index">/index.jsp</result>
            <result name="success">/login.jsp</result>
        </global-results>
    </package>

    <!-- 自定义拦截器 -->
    <package name="permissionInterceptor"
        namespace="/permissionInterceptor" extends="base">
        <interceptors>
            <!-- 注册自定义的权限控制拦截器 -->
            <interceptor name="authorityInterceptor" class="com.ljq.action.AuthorityInterceptor"/>
            
            <!-- 把自定义的权限控制拦截器和默认的拦截器栈加到新的自定义的拦截器栈 -->
            <interceptor-stack name="myInterceptors">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="authorityInterceptor"/>
            </interceptor-stack>
        </interceptors>
        <!-- 指定新的自定义的拦截器栈为默认的拦截器栈,这样自定义的权限控制拦截器就可以发挥作用了 -->
        <default-interceptor-ref name="myInterceptors"/>
    </package>
    
    <package name="employee" extends="permissionInterceptor">
        <action name="*Employee" class="com.ljq.action.EmployeeAction" method="{1}">
        </action>
    </package>

</struts>
复制代码

           

web.xml配置文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">

    <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>

</web-app>
复制代码

           

            

跟踪控制台打印的信息

1、未登录,访问查找功能:http://localhost:8083/struts2_authority_interceptor/addEmployee.do

2、已登录,访问添加功能:http://localhost:8083/struts2_authority_interceptor/login.jsp

                                   http://localhost:8083/struts2_authority_interceptor/addEmployee.do



已登录,访问查找功能:http://localhost:8083/struts2_authority_interceptor/login.jsp

                                   http://localhost:8083/struts2_authority_interceptor/findEmployee.do

 


3、已登录,访问删除功能

已登录,访问查找功能:http://localhost:8083/struts2_authority_interceptor/login.jsp

                               http://localhost:8083/struts2_authority_interceptor/deleteEmployee.do

 

 

完毕!!

分享到:
评论
2 楼 Ryan200909 2012-11-25  
lbj2004032 写道
请问如果我有分配权限功能 你怎么控制,看你这个权限都是写死的

这里主要讲的是拦截器(Interceptor),只是用权限作为例子讲解,并非真正意义上的系统权限~
1 楼 lbj2004032 2012-09-21  
请问如果我有分配权限功能 你怎么控制,看你这个权限都是写死的

相关推荐

    Struts2权限控制

    3. **注解方式**:除了XML配置,Struts2也支持使用注解在Action类或方法上直接声明拦截器,这样可以更方便地控制权限。 4. **共享数据**:在拦截器中,可以利用ActionContext或ThreadLocal等机制来传递和共享数据,...

    反射和注解的妙用-struts2权限的控制

    ### 反射与注解在Struts2中的应用——实现精细权限控制 #### 一、引言 在软件开发过程中,权限控制是一项重要的安全措施,它确保系统的不同部分只能被授权用户访问。对于大型管理系统(MIS)而言,基于方法级别的...

    Struts2框架及注释和用法

    拦截器是Struts2的一大特色,它们在Action执行前后进行额外处理,如日志记录、权限检查等。常见的拦截器有ValidationInterceptor(字段验证)、PrepareInterceptor(初始化Action属性)和ResultInterceptor(处理...

    Struts2+spring注解配置

    Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...

    Struts2+spring注解配置简介

    Struts2主要用于处理MVC(Model-View-Controller)架构中的控制器部分,而Spring则是一个全面的后端解决方案,包括依赖注入、事务管理、AOP(面向切面编程)等功能。本篇文章将详细介绍如何在Struts2和Spring框架中...

    权限控制(struts2+hibernate+spring+struts-menu+valuelist)

    本项目以"权限控制(struts2+hibernate+spring+struts-menu+valuelist)"为主题,采用一系列成熟的技术栈来实现这一目标。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Struts2作为MVC框架,负责处理HTTP...

    struts2 ,struts2 demo

    Struts2是一个强大的Java EE应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的Web应用。这个“struts2,struts2 demo”很显然是一个包含Struts2框架示例代码的压缩包,旨在帮助开发者理解和学习如何在实际...

    Struts2 拦截器注解(二十七)

    拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...

    struts2jar.zip

    7. **Action的注解配置**:Struts2支持通过注解来简化配置,如@Action、@Result等。 8. **.struts2-convention-plugin**:这个插件允许开发者使用约定优于配置的方式开发,减少XML配置。 9. **国际化和本地化**:...

    Struts2 Struts2 超好的Struts2 pdf 文档

    3. **拦截器(Interceptors)**:拦截器是Struts2的一大特色,它们按照预定义的顺序在Action调用前后执行,可以实现如日志记录、权限验证、性能监控等功能。常见的拦截器有`params`(处理请求参数)、`validation`...

    struts2讲义 struts2讲义struts2讲义struts2讲义struts2讲义

    - 在web.xml中配置过滤器(Filter),通常使用`FilterDispatcher`作为入口点,它是Struts2的核心组件之一。 - 这个过滤器会捕获所有进入Web应用的HTTP请求,并将它们传递给Struts2框架处理。 - 配置过程中需要注意...

    struts2.3.4.1注解零配置

    在Struts2中,Action是业务逻辑的主要载体,而Interceptor(拦截器)则用于执行一些预定义的任务,如日志、权限检查等。 在传统的Struts2配置中,我们需要在struts.xml文件中定义Action类及其对应的Action方法,...

    struts2和shiro完美整合解决方案

    通过这样的整合,开发者可以轻松地在Struts2应用中实现用户登录、权限控制和角色管理。Shiro的简洁API和Struts2的MVC架构使得整个过程既高效又易于维护。在实际开发中,还可以根据需求扩展Shiro的功能,例如实现记住...

    Struts2的视频学习代码

    Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用程序。这个“Struts2的视频学习代码”资料可能是为了帮助开发者深入理解和实践Struts2的核心概念和机制。以下是根据标题...

    Struts2框架 jar JAVA开发 Struts2.jar架包 Struts2开发实例

    然后配置web.xml文件,设置Struts2的前端控制器Filter。接着,创建Action类,它是业务逻辑的载体,并通过注解或配置文件进行配置。最后,定义视图层的JSP页面,利用Struts2的标签库来展示结果。 **Struts2配置文件*...

    Struts2与Struts1区别

    - Struts2 引入了拦截器机制,这是一个重要的增强,允许开发者定义一系列预定义和自定义的处理逻辑,可以用于事务管理、权限控制、日志记录等多种用途,增强了框架的可扩展性和可维护性。 总的来说,Struts2 相比 ...

    struts2核心技术整理

    总结,Struts2作为Java web开发的主流框架之一,其核心技术包括Action、Interceptor、Value Stack、OGNL等,通过这些组件和机制,开发者能够高效地构建MVC应用,实现业务逻辑与表现层的分离,同时具备良好的扩展性...

    Struts2 2.3.24开发文档

    Struts2的配置方式灵活多样,可以通过XML配置文件、注解或者Java配置类来设定Action、Result和Interceptor。XML配置文件通常是`struts.xml`或`struts-default.xml`,在这里定义了各个Action的映射、结果类型以及拦截...

    struts2的复习

    5. 拦截器:拦截器是Struts2的核心组件,它们按照预设顺序在Action执行前后执行,实现AOP(面向切面编程)功能,如日志记录、权限验证、性能监控等。开发者可以通过自定义拦截器来扩展框架功能。 五、配置与注解 6....

    STRUTS2站点,STRUTS2学习实例8

    3. **拦截器**:Struts2的拦截器是AOP(面向切面编程)的一种实现,它们可以插入到Action调用之前或之后,执行如日志、权限检查、数据验证等通用任务。例如,`ValidationInterceptor`用于验证用户输入,`...

Global site tag (gtag.js) - Google Analytics