Struts2 interceptor使用经验小结
1. interceptor 调用Spring容器中的bean
在interceptor中常有需要调用Spring Bean的需要,其实很简单和Struts2的Action一样配置即可.
Spring中的配置
<!--spring配置 -->
1 <bean id="authorityInterceptor" class="com.xxx.interceptor.AuthorityInterceptor"/> <bean id="operationInterceptor" class="com.xxx.interceptor.OperationInterceptor">
<property name="defectService" ref="sysDefectService"/>
<property name="projectService" ref="projectService" />
<property name="includeMethods">
<value>*Modify,*Delete</value>
</property>
</bean>
Struts2中的配置
<interceptors>
<interceptor name="loginInterceptor" class="authorityInterceptor"/>
<interceptor name="operationInterceptor" class="operationInterceptor"/>
</interceptors>
2. 如何获得当前Action名字
public String intercept(ActionInvocation aInvocation) throws Exception {
// 获取请求的action名称
String actionName = aInvocation.getInvocationContext().getName();
//获取参数集合
Map parameters = aInvocation.getInvocationContext().getParameters();
....
}
3. 方法拦截器黑白名单可以使用通配符
拦截器代码:
package xx.interceptor;
import xx.action.ProjectAction;
import xx.action.SysDefectAction;
import xx.po.Project;
import xx.po.SysDefect;
import xx.po.User;
import xx.service.IProjectService;
import xx.service.ISysDefectService;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import java.util.List; public class OperationInterceptor extends MethodFilterInterceptor {
private ISysDefectService defectService;
private IProjectService projectService; protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
boolean hasAuth = false;
String cunrrentId = "";
Object currentActon =actionInvocation.getAction();
ActionContext actionContext = actionInvocation.getInvocationContext();
User currentUser = (User)actionContext.getSession().get("currentUser");
if(currentUser == null
|| currentUser.getEmployer()==null
|| currentUser.getGroup() == null
|| currentUser.getEmployer().getEmpId()+""==null
)
{
return Action.LOGIN;
}
//获取当前用户的epmId
String empId = currentUser.getEmployer().getEmpId() + ""; if(currentActon instanceof ProjectAction){
//是否第二次检查权限
List<Project> projectList = currentUser.getProjectList();
if (projectList==null || projectList.size()<1){
ProjectAction projectAction = (ProjectAction)currentActon;
cunrrentId = projectAction.getProjId();
projectList = projectService.getProjectsByEmpId(empId);
} //如果获取列表失败,则提示无权限
if(projectList==null || projectList.size()<1){
return "deny";
}else {
currentUser.setProjectList(projectList);
}
for(Project project:projectList){
if(cunrrentId.equals(project.getProjId()+"")){
hasAuth = true;
}
}
if(hasAuth){
return actionInvocation.invoke();
} }else if(currentActon instanceof SysDefectAction){
SysDefectAction sysDefectAction = (SysDefectAction)currentActon;
List<SysDefect> sysDefectList = defectService.getSysDefectsByEmpId(empId);
if(sysDefectList==null || sysDefectList.size()<1){
return "deny";
}else {
currentUser.setSysDefectList(sysDefectList);
}
for(SysDefect sysDefect:sysDefectList){
if(cunrrentId.equals(sysDefect.getDefId()+"")){
hasAuth = true;
}
}
if(hasAuth){
return actionInvocation.invoke();
}
}
return "deny"; //To change body of implemented methods use File | Settings | File Templates.
} public ISysDefectService getDefectService() {
return defectService;
} public void setDefectService(ISysDefectService defectService) {
this.defectService = defectService;
} public IProjectService getProjectService() {
return projectService;
} public void setProjectService(IProjectService projectService) {
this.projectService = projectService;
}
}
Spring配置:
<bean id="authorityInterceptor" class="xx.interceptor.AuthorityInterceptor"/>
<bean id="operationInterceptor" class="xx.interceptor.OperationInterceptor">
<property name="defectService" ref="sysDefectService"/>
<property name="projectService" ref="projectService" />
<!-- 白名单属性配置,注意*的用法 -->
<property name="includeMethods">
<value>*Modify,*Delete</value>
</property>
</bean>
struts2配置:
<interceptors>
<interceptor name="loginInterceptor" class="authorityInterceptor"/>
<interceptor name="operationInterceptor" class="operationInterceptor"/> <interceptor-stack name="authInterceptor-stack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="operationInterceptor"/> </interceptor-stack> </interceptors>
Struts2 interceptor使用经验小结的更多相关文章
- Struts2 Interceptor学习
Interceptor的设计思想,其实是Spring里面的AOP思想,尽管Struts2又有自己的Interceptor但是,在实际开发中,用的较少,SSH整合之后你可以采用AOP事务处理进行拦截,更 ...
- Struts2 - Interceptor中取得ActionName、Namespace、Method
在Struts2的Interceptor中取得当前执行对应的ActionName.Namespace.Method方法: 可以使用: System.out.println(invocation.get ...
- Struts2命令空间小结
sturts2命名空间小结,以tomcat为服务器 1. 命名空间配置为“/” <package name="default" namespace="/" ...
- 【心得】Lattice后端使用经验小结(ECP5UM,DDR3,Diamond3.10,Reveal逻辑分析)
[博客导航] [导航]FPGA相关 背景 下边的内容,适合初次使用Lattice的.具备FPGA开发经验的同学. 1.初次使用,还真遇到不少的坑,Lattice的工具也有不少优缺点,通过总结,希望能缩 ...
- Struts2(七)基础小结
一.struts2和action 二.Result 三.struts.xml 四.namespace 第一种绝对路径 <form action="${pageContext.reque ...
- Git使用经验小结
2012春,开始正式使用SVN,2014年9月加入一起好后,开始使用Git. 有了一些使用经验,也看了下网上关于"Git全胜SVN"的言论. 结合自己的实际情况,简要写几句: 1 ...
- mybatis 使用经验小结
一.多数据源问题 主要思路是把dataSource.sqlSesstionFactory.MapperScannerConfigurer在配置中区分开,各Mapper对应的包名.类名区分开 <? ...
- jmeter linux使用经验小结
1. 确认务必安装了JDK,并且把路径配置OK.否则执行会报错. 2. 当做负载机时,在hosts 配置上 你的ip 你的hostname 或者使用./bin/jmeter-server ...
- DEV_TreeList使用经验小结
1. 点击叶子节点是希望Open键显示,点击非叶子节点时希望隐藏.实践中发现点击到了非叶子节点图标,Open没有隐藏,如何解决? 增加一个判断: if (_hitInfo.HitInfoType != ...
随机推荐
- ajax发送请求
首先创建XMLHttpRequest对象,利用此对象发送请求 主页面 <!doctype html> <html lang="en"> <head&g ...
- hasshmap输出value
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...
- Unity3d 播放高质量视频解决方案
Unity3d 播放高质量视频解决方案~ 最近在折腾一个视频游戏.真的是一个视频游戏,游戏主背景是个大视频.可能切换三四个视频,而且需要无缝切换. 平台是安卓,蕊片是rockclip.找了各式各样的插 ...
- webview中java与js交互
WebView提供了在Android应用中展示网页的强大功能.也是目前Hybird app的大力发展的基础.作为Android系统的一个非常重要的组件,它提供两方面的强大的能力:对HTML的解析,布局 ...
- js 金额格式化
//格式化金额 function fmoney(s, n) { n = n > 0 && n <= 20 ? n : 2; s = parseFloat((s + &quo ...
- <a>多颜色标签点击之后保持原色的一次实践, Ext Panel下解决及通用方案思路
代码为片段, 需要自行设置全部环境方可全部运行. 案例背景 使用Ext开发了一个表格,需要根据一列值来动态设置颜色. 效果如下: 说明: 不同行显示不同的内容, 作为标题行, 可以点击链接到其他地方. ...
- const char*、char*、char* const、char[]、string的区别
1.const char* p: p is a pointer to const char(char const* p 一样) 意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...
- VS2010 EntityFramework Database First
本文演练介绍如何使用实体框架进行 Database First 开发.通过 Database First,可以从现有数据库对模型进行反向工程处理.模型存储在一个 EDMX 文件(扩展名为 .edmx) ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- free -m
free -m total used free shared buffers cached Mem: 7760 1572 6187 0 9 ...