拦截器是很实用的功能
下面完成以下的需求
如果用户登录后可以访问action中的所有的方法,如果用户没有登录那么不允许访问action中的方法,并且提示你没有权限执行该操作
1.在一个类中完成要用到的属性和方法
package com.qn.struts;
import java.io.File;
import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;
public class HellowAction extends ActionSupport{ private String message;
public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String addUI(){ this.message="addUI"; return "success"; } @Override public String execute() throws Exception { this.message="execute"; return "success"; } }
2.定义user.jsp页面
<%request.getSession().setAttribute("user","qining"); %> 用户已经登录
3.定义quit.jsp页面
<%request.getSession().removeAttribute("user");%> 用户已经退出登录
4.定义message.jsp页面
${ message }
5.自定义拦截器
package com.qn.intercepter;
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor;
public class PermissionIntercepter 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){//如果用户不为空,就表示用户已经登录允许执行action中的方法 return invocation.invoke();//调用这句代码被拦截的方法就会被执行,把原本的试图名称原样的返回出去 } ActionContext.getContext().put("message", "您没有权限执行该操作"); return "success"; }
}
6.在struts.xml中配置拦截器
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" " "> <struts> <package name="default" namespace="/test" extends="struts-default"> <interceptors> <interceptor name="permission" class="com.qn.intercepter.PermissionIntercepter"></interceptor> <interceptor-stack name="permissionStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="permission"></interceptor-ref> </interceptor-stack><!-- 定义拦截器栈 <interceptor-ref name="defaultStack"></interceptor-ref>要放在第一行 --></interceptors> <global-results> <result name="success">/message.jsp</result> </global-results> <action name="list_*" class="com.qn.struts.HellowAction" method="{1}"> <interceptor-ref name="permission"></interceptor-ref><!--如果这样定义就会失去系统自带的烂机器功能 因此这时候我们要定义一个拦截器栈 --> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
因为struuts2中如文件上传、数据验证、封装请求参数到action等功能都是有系统的defaultStack中的烂机器实现的,所以我们定义烂机器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。 如果希望保险所有的action都使用自定义拦截器,可以通过<default-interceptor-ref name="permissionStack"></default-interceptor>把拦截器定义为默认拦截器,注意:每一个包只能指定一个默认拦截器、另外,一旦我们为该包中的某一个action显示指定了某个拦截器,则默认的拦截器不会起作用
结果