文档章节

struts1的权限控制

wangrikui
 wangrikui
发布于 2014/01/11 21:03
字数 676
阅读 170
收藏 3

为了简便起见,我就做了个对是否登录的权限判断,原理都是一样,其他的可以类推。代码如下:

一、首先,自定义一个注解类,把该注解放在你想要拦截的action的方法上,至于到底是方法,通过下面的自定义的拦截器,根据反射技术获得。

Permission.java

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

/*自定义注解:Permission*/
@Retention(RetentionPolicy.RUNTIME)  //注解执行的时机:程序运行时
@Target({ElementType.FIELD, ElementType.METHOD}) //注解应用的范围:属性、方法
public @interface Permission {
 public String name() default "";
}

二、然后,自定义一个拦截器,对所有的action进行拦截,判断是否有权限。该类继承了RequestProcessor类,这个类正是struts1拦截所有action的工作类,所以自定义的类事实上是重写了struts1的RequestProcessor类的处理action的方法。工作原理就是:根据自定义的注解,通过反射,获得要拦截的方法。对其进行权限判断。

MyInterceptorAction.java

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.actions.MappingDispatchAction;

public class MyInterceptorAction extends RequestProcessor {

 @Override
 protected ActionForward processActionPerform(HttpServletRequest request,
   HttpServletResponse response, Action action, ActionForm form,
   ActionMapping mapping) throws IOException, ServletException {
  // 得到struts想调用的方法  action===》execute   dispatchAction====>method--add
  Method method=getInvokeMethod(request, response, action, form, mapping);
  
  //检查方法上是否有注解
  Permission p=method.getAnnotation(Permission.class);
  
  if(p==null){//直接放行
   return super.processActionPerform(request, response, action, form, mapping);
  }else{
   //检查用户是否有权限
   User user=(User) request.getSession().getAttribute("user");
   if(user==null){
    request.setAttribute("errormessage", "请登录后再访问");
    return mapping.findForward("failedlogin");
   }
   //TODO 其他你要想进行权限判断的代码
  }
  
  return super.processActionPerform(request, response, action, form, mapping);
 }

 private Method getInvokeMethod(HttpServletRequest request,
   HttpServletResponse response, Action action, ActionForm form,
   ActionMapping mapping) {
  String methodName=null;
  if(DispatchAction.class.isAssignableFrom(action.getClass())){ //判断当前的action是否继承DispatchAction
   methodName=request.getParameter(mapping.getParameter()); //得到继承于DispatchAction的action执行的方法的名称
  }else if(MappingDispatchAction.class.isAssignableFrom(action.getClass())){
   methodName=mapping.getParameter(); //得到继承于MappingDispatchAction的action执行的方法的名称
  }else{
   methodName="execute";//得到继承于Action的action执行的方法的名称
  }
  Class<?>[] parameterTypes={ActionMapping.class,ActionForm.class,HttpServletRequest.class,HttpServletResponse.class};
  try {
   Method method=action.getClass().getMethod(methodName, parameterTypes);
   return method;
  } catch (Exception e) {
   throw new RuntimeException(e);
  }  
 }
}

第三、最后,别忘了配置struts-config.xml文件,主要是将自定义的拦截器让struts能够识别:

<controller processorClass="包名.MyInterceptorAction"/>

好了,就这么简单,最后,在你想拦截的action的方法上加上自定义的注解吧,@Permission ,然后要实现什么样的权限,就在第二步自定义的拦截器中的对应的位置写代码就OK了!

© 著作权归作者所有

wangrikui
粉丝 10
博文 31
码字总数 20614
作品 0
南京
后端工程师
私信 提问
关于以Spring3.0 MVC进行项目开发的疑问

该项目是一个行业门户,使用Java技术开发。该项目从整体角度考虑,主要有两个关注点,一个是MVC,另一个是数据持久化。原计划是使用Struts1 + Spring3 + Hibernate3来设计,但Struts1太过古老...

三阶魔方
2011/08/11
5.2K
24
3.1 Struts2概述

Struts是一个基于MVC架构的框架。 3.1.1 MVC简介 包含三个基础部分:Model、Viev和Controller(上一章中JSP为View,Servlet为Controller,JavaBean为Model) MVC优点: 模型返回的数据与显示...

JerryPan
2016/02/19
432
1
那些年Struts 1.X 而今我还是不会

struts1是WEB程序MVC分层架构中的C,属于控制层,主要进行处理用户的请求,基于请求驱动。 获取用户的请求地址并将表单中的数据封装到Form 对象后交给Action进行处理。 在Action中进行条用业...

小帅帅丶
2015/03/19
133
0
Struts2 的 struts.xml 配置中 namespace 的使用

Struts2 的 struts.xml 中是分 package 配置的,可以为 package 设置 namespace 属性,如 <package namespace="/secure" ....> ...... </package> 如果没有指定 namespace 属性,默认 namesp......

淼淼
2013/01/18
171
0
Struts2与Struts1的对比

Action 类: • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的...

磊神Ray
2011/08/26
75
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro 兼容 h5 踩坑指南

最近一周在改造 公羊阅读🐏 Taro 版本适配 h5 端,过程中改改补补,好不酸爽。 本文记录📝遇到的问题,希望为有相同需求的哥们👬节约点时间。 Taro 版本:1.3.9。 client_mobile_taro...

dkvirus
今天
4
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部