【Struts2学习笔记(10)】自定义拦截器管理权限访问
(1)拦截器的功能什么的都不说了直接上代码来的直接些:
要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:
下面自定义一个拦截器:
package cn.lc.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class PermissionInterceptor implements Interceptor
{
public void destroy()
{
}
public void init()
{
}
public String intercept(ActionInvocation invocation) throws Exception
{
Object user = ActionContext.getContext().getSession().get("user");
if (user != null)
{
return invocation.invoke(); // 如果user不为null,代表用户已经登录,允许执行action中的方法
}
ActionContext.getContext().put("message", "你没有权限执行该操作");
return "success";
}
}
Action的代码:
package cn.itcast.action;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String addUI(){
this.message = "addUI";
return "success";
}
public String execute() throws Exception{
this.message = "execute";
return "success";
}
}
struts.xml文件配置如下:
<?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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.action.extension" value="do,action" />
<constant name="struts.multipart.maxSize" value="10701096" />
<package name="employee" namespace="/control/employee" extends="struts-default">
<interceptors>
<interceptor name="permission" class="cn.itcast.interceptor.PermissionInterceptor" />
<interceptor-stack name="permissionStack">
<!-- 系统的拦截器放在前面 自己定义的放在后面 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="permission" />
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器 可以让action一方面使用改默认的拦截器 还可以使用系统自带的拦截器 -->
<default-interceptor-ref name="permissionStack" />
<global-results>
<result name="success">/WEB-INF/page/message.jsp</result>
</global-results>
<!-- 使用下边的方法,这样的话会覆盖默认拦截器中的拦截器栈等功能 -->
<action name="list_*" class="cn.itcast.action.HelloWorldAction" method="{1}">
</action>
</package>
</struts>
二、过程如下:
1.当表单进行提交的时候:
<form action="<%=request.getContextPath()%>/control/employee/list_execute.action" method="post">
id:<input type="text" name="person.id"><br/>
name:<input type="text" name="person.name"><br/>
<input type="submit" value="发送"/>
</form>
2.找到struts.xml文件中的action 匹配到 list_*处,虽然此action中没有拦截器
(正常的配置应该是这样的
<action name="list_*" class="cn.itcast.action.HelloWorldAction" method="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
<interceptor-ref name="permissionStack"/>
</action>
)
3.但是我们有默认的拦截器,这样的话我们不仅可以使用自定义的拦截器 还可以使用系统自带的拦截器!实现了拦截功能!
<default-interceptor-ref name="permissionStack" />
注意:(1)因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
(2)如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。(每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。)
注:转载请注明出处!