struts2之注解权限控制

本文详细介绍了如何在Struts2框架中实现权限控制与拦截器功能,包括项目目录结构、权限控制注解类、权限拦截器类、客户信息类、action类、首页和登录页配置,以及struts2和web.xml配置文件。通过这些组件,实现了基于权限的请求过滤,确保只有具备相应权限的用户才能执行特定的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

                

以下模拟案例大概实现如上需求,接下来废话少说,直接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>

转载于:https://my.oschina.net/xiufeng/blog/118377

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值