今天结合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/SunShineSimple/p/4889705.html

struts 权限控制相关推荐

  1. struts2中用interceptor实现权限控制

    在jsp servlet中我们通常使用Servlet Filter控制用户是否登入, 是否有权限转到某个页面.在struts2中我们应该会想到他的拦截器(Interceptor), Intercept ...

  2. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制

    从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...

  3. Struts2使用Interceptor实现权限控制的应用实例详解

    Struts2使用Interceptor实现权限控制的应用实例详解 拦截器:是Struts2框架的核心,重点之重.因此,对于我们要向彻底学好Struts2.0.读源码和使用拦截器是必不可少的.少说了. ...

  4. struts2如何使用拦截器进行用户权限控制

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...

  5. AOP下的权限控制实现

    摘要 面向方面的编程(AOP)是一种新的编程技术,它弥补了面向对象的编程(OOP)在跨越模块行为上的不足.AOP引进了Aspect,它将影响多个类的行为封装到一个可重用模块中,它允许程序员对横切关注点 ...

  6. 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree

    回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...

  7. mysql用户控制登录_MySql用户权限控制_MySQL

    bitsCN.com MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号: www.bitsCN.com [sql] CREATE USER use ...

  8. 前、后端分离权限控制设计和实现思路

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:8rr.co/9QUT 简述 近几年随着react.angu ...

  9. cvs linux权限,Linux下CVS+ACL的权限控制是什么? 爱问知识人

    考试大Linux站整理:我的CVS服务器端是在linux下,我安装了cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz,利用CVS+ACL来做权限控制.但是现在遇到几个问题 ...

最新文章

  1. 面试常问 Java基础 冒泡排序
  2. 设计模式之Builder(建造者)(转)
  3. Spring与日志的整合
  4. Mysql5.7.2安装教程+下载地址(windows)
  5. mysql_connect报告”No such file or directory”错误的解决方法
  6. 面试稳了!BATJ 等大厂 400+ 道面试题全汇总!
  7. python批量下载bilibili视频_如何批量下载bilibili的视频?
  8. 研究:三分之一英国人或因机器人“丢饭碗”
  9. MarkDown -- 基本语法
  10. 文件储存php源码,求php后台代码 保存图片文件
  11. mongodb lbs java_MongoDB开发LBS应用
  12. 如何选择和更换阿里云服务器操作系统?
  13. 【Haskell】函子 · 应用函子 · 单子
  14. 深入理解数据库磁盘存储(Disk Storage)
  15. Qt项目升级到Qt6经验总结(别人写的,仅作记录)
  16. 如何给视频配上字幕?教你几种视频配字幕小妙招
  17. 【python 库】 pandas 教程
  18. Swin Transformer:层次化视觉Transformer
  19. 直流放大器2级电路设计
  20. 中国海上风电装备行业经济效益评价与投资战略规划展望报告2022-2028年版

热门文章

  1. jQueryHTMLCSS3实现垂直手风琴折叠菜单方法讲解
  2. java jdbc dbcp连接SQL Server
  3. Persist Security Info 参数的作用
  4. 商场专柜私收银现象治理要点
  5. linux apache gzip filters,Linux Apache2如何开启gzip (deflate module) 压缩功能
  6. linux7添加两个网关,RHEL7设置IP地址、网关和DNS(示例代码)
  7. ajax success function_Ajax封装
  8. 2021阿里云开发者大会|【云原生数据库:一站式数据服务】分论坛即将开启
  9. 官方剧透:1.11 发版前我们偷看了 Flink 中文社区发起人的聊天记录
  10. 在家办公这些天整理的Kafka知识点大全