struts2拦截器值拦截器的方法过滤

以前我们写的拦截器继承AbstractInterceptor类,可能会拦截整个Action中的所有方法而无法控制。而在实际开发中,很多时候我们只希望那个拦截器拦截某一个或者某几个请求,这样就导致了有些方法本来不用拦截,而拦截器将其拦截造成麻烦。所以这里编写自定义拦截器时就可以继承MethodFilterInterceptor类,这样就可以选择某些方法进行拦截,而不会拦截一个Action里面所有的方法。使编程更加灵活。

在struts2中提供了一个com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象类,该类继承ActionInvocation类,并重写了intercept()方法,同时还提供了doIntercept()抽象方法。

MethodFilterInterceptor中提供了两个方法:
      public void setExcludeMethods(String excludeMethods):设置不需要过滤的方法,所有在excludeMethods字符串列出的方法都不会被拦截。
      public void setIncludeMethods(String includeMethods) :设置需要过滤的方法,所有在includeMethods字符串列出的方法都不会被拦截。
     注意:如果一个方法的名称同时出现在以上两种方法中,则此方法会被拦截。

示例代码:
示例说明:访问web首页时显示一个超链接,点击可进入用户中心,但是在进入用户中心之前会被拦截器拦截判断用户是否登录,如果没有登录,拦截到登录界面,如果已经登录,进入用户中心。


首页index.jsp:

<a href="LoginAction!see.action">点击进入用户中心</a>
拦截器: SeeInterceptor.java:

 package com.web.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

//检测用户查看资源时是否登录的拦截器
//继承MethodFilterInterceptor可以选择某些方法进行拦截
@SuppressWarnings("serial")
public class SeeInterceptor extends MethodFilterInterceptor {
    protected String doIntercept(ActionInvocation arg0) throws Exception {
        System.out.println("进来拦截器没");
        //获取session
        Map<String, Object> session=arg0.getInvocationContext().getSession();
        //获取session里面存的username
        String username=(String) session.get("username");
        //如果session里面存的有用户名,证明用户登录了
        if(username!=null&&!username.equals("")){
            return arg0.invoke();
        }else{
            return Action.LOGIN;
        }
    }
}

action:LoginAction.java:

package com.web.action;
@SuppressWarnings("serial")
public class LoginAction extends BaseAction{
    private String username;
    private String password;
   
    public String see(){
        return SUCCESS;
    }
    //处理登录的方法
    public String login(){
        if(username.equals("admin")&&password.equals("123456")){
            session.put("username", username);
            return "index";
        }else{
            return LOGIN;
        }
    }
   
   
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
   
}

用户中心界面:success.jsp:

 <h2>登陆成功,这里是用户中心</h2>

登录界面:login.jsp:

<h2>拦截器测试</h2>
    <s:form action="LoginAction!login.action" method="post">
        <s:textfield name="username" label="姓名"></s:textfield>
        <s:password name="password" label="密码"></s:password>
        <s:submit value="登录"></s:submit>
     </s:form>

struts2配置文件:struts.xml:

<struts>
    <constant name="struts.devMode" value="true"></constant>
    <!-- 配置包元素 -->
    <package name="default" extends="struts-default" namespace="/">
      <interceptors>
        <interceptor name="SeeInterceptor" class="com.web.interceptor.SeeInterceptor"></interceptor>
      </interceptors>
      <action name="LoginAction" class="com.web.action.LoginAction">
        <interceptor-ref name="SeeInterceptor">
          <!-- 设置不用被过滤的方法 -->
          <param name="excludeMethods">login</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <result name="success">/success.jsp</result>
        <result name="login">/login.jsp</result>
        <result name="index">/index.jsp</result>
      </action>
    </package>
</struts>

web.xml:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>struts.i18n.encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值