快速入门Struts2(中篇)拦截器,不登陆别想访问我

更多Struts2在框架开发


1 拦截器?

Struts2封装了很多的功能,这些功能都在拦截器里面,每次都会执行默认拦截器。Struts2中的拦截器有点类似于传统的过滤器,是AOP思想(不通过修改源代码的方式扩展功能)与责任链模式(类似过滤链)的结合,作用无非就是拦截,符合条件就放行,不符合就拦下来。

相比于过滤器的过滤内容(如:html、jsp、servlet、路径等等),拦截器只能拦截action,并且是在action创建之后,action里面的方法执行之前进行拦截

Struts2中有很多默认的拦截器(每次都会执行)和其他拦截器(不一定会执行),但实际开发中,我们可以自定义某一功能的拦截器。

2 不登陆别想进这个页面

案例目标: 在Struts2的基础上,编写自定义的登陆过滤器,实现功能: 如果不是登陆状态,则禁止访问主页,将跳转到登陆页面。

2.1 写一个Struts2不用数据库的简单登陆

Struts2的入门请搜索本博客上篇和中篇,本文不再详细累述

登陆页面

<form action="${pageContext.request.contextPath}/user_login.action" method="post" targer="_parent">
    用户名:<input type=text name="userName" />默认admin<br>
    手 机:<input type=password name="userPhone" />默认123<br>
    <input type="submit" value="登陆"/>
</form>

action(固定用户名和手机)

/**
     * 用户登陆
     * @return
     */
    public String login() {
        HttpServletRequest request = ServletActionContext.getRequest();
        //设置固定的用户名admin和手机123
        if ("admin".equals(user.getUserName()) && "123".equals(user.getUserPhone())) {
            //向session中放值
            request.getSession().setAttribute("userSession", user);
            return "success_login" ;
        }else {
            return "fail_login" ;
        }
    }

主页

当前用户:${userSession.userName },欢迎您进入系统主页!!

2.2 编写自定义的登陆拦截器

创建拦截器类

package edu.kmust.interceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
 * 拦截器类
 * @author zhaoyuqiang
 *
 */
public class LoginInterceptor extends MethodFilterInterceptor {
    /**
     * 该方法写拦截器逻辑  
     */
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        /*
         *  获取Session域中的值
         */
        HttpServletRequest request = ServletActionContext.getRequest();
        Object obj = request.getSession().getAttribute("userSession");
        if(obj != null) {
            //是登陆状态,拦截器执行类似放行的操作
            return invocation.invoke();
        }else {
            //不是登陆状态,不能执行Action中的登陆方法,返回登陆页面
            return "fail_login";
        }
    }
}

在struts.xml配置文件中注册拦截器(配置action与拦截器的关系)

<struts>
    <package name="XXX" extends="struts-default" namespace="/">
      <!--1.在package标签里面声明自定义拦截器  -->
      <!-- 
          interceptor: 
               name: 拦截器的名字,随便起的
               class:拦截器类的全路径            
       -->
      <interceptors>
           <interceptor name="loginIntercept" class="edu.kmust.interceptor.LoginInterceptor"></interceptor>
      </interceptors>
         <action name="XXX" class="edu.kmust.action.XXX" method = "{}">
            <!--2.在action标签中使用自定义的拦截器  
                interceptor-ref : 使用自定义拦截器
                      name: 自定义拦截器的名称
                      param : 配置action里面某些方法不拦截
                           name属性:excludeMethods(忽略某些方法),单词写错不会报错
                           值: action中不拦截的方法名称,如果有多个方法,则用逗号隔开就可以了       
            -->
            <interceptor-ref name ="loginIntercept">
                <param name="excludeMethods">login</param>
            </interceptor-ref>
            <!--3.在action标签中把默认拦截器手动执行一次
                      因为配置自定义拦截器后,默认拦截器就不执行了,所以需要手动执行一次默认拦截器才行
              -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
           <!--result标签省略-->
    </package>
</struts>    

代码案例可参考:

https://download.csdn.net/download/g425680992/10611267

猜你喜欢

转载自blog.csdn.net/g425680992/article/details/81781995
今日推荐