struts2拦截器加自定义注解实现权限控制

https://blog.csdn.net/paul342/article/details/51436565

今天结合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

完毕!!

原文地址:https://www.cnblogs.com/feifeicui/p/8733344.html

时间: 2024-08-05 19:15:04

struts2拦截器加自定义注解实现权限控制的相关文章

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

[Java]利用拦截器和自定义注解做登录以及权限验证

1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.Retention

拦截器和自定义注解@interface

1 .拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略. 拦截用户的请求并进行相应的处理,比如:判断用户是否登陆,判断用户权限,是否在可购买时间内,记录日志信息等.. 创建拦截器:实现HandlerInterceptor @Component public class TestInterceptor implements HandlerInterceptor { //请求在进入Handler之前,该

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

Struts2 拦截器(Interceptor )原理和配置

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

Struts2 拦截器

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故将这些权

Struts2拦截器的使用 (详解)

这位仁兄的写的不错,我照抄过来了:http://www.blogjava.net/i369/articles/162407.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox">  <param name=&q

Struts2整理-----Struts2拦截器

struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理. 实现struts2拦截器的方法 1.实现Interceptor接口,实现init(),destory(),intercept()方法. 2.继承AbstractInterceptor类,重写intercept()方法. 3.继承MethodFilterInterceptor类,重写doIntercept()方法 拦截器实现原理: 当请求struts2的action时,strus2会查找配置文件,并根据其

ssh2——struts2 拦截器

虽然没学过struts1吧,但是了解到struts1中并没有拦截器,  到Struts2才有,它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作用,那么好,在这里它是拦截什么的呢?在struts2中拦截器是用来拦截Action的,在执行Action之前拦截器会起一定的作用,执行一些预先处理的代码, 接着去执行Action中相关的方法,之后,又会回到拦截器里面,接着去执行后续的一些操作.刚刚学习,如果我理解的不对的话,请大家留言指正啊. St