拦截器是很实用的功能
下面完成以下的需求
如果用户登录后可以访问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显示指定了某个拦截器,则默认的拦截器不会起作用
结果