zoukankan      html  css  js  c++  java
  • Struts2整理-----Struts2拦截器

    struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理。

    实现struts2拦截器的方法

    1.实现Interceptor接口,实现init(),destory(),intercept()方法。

    2.继承AbstractInterceptor类,重写intercept()方法.

    3.继承MethodFilterInterceptor类,重写doIntercept()方法

    拦截器实现原理:

    当请求struts2的action时,strus2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截 

    拦截器和过滤器比较

    1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

    2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

    3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

    4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

    5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

    新建一个案例

    新建Action

    package com.aaron.action;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
    
        private static final long serialVersionUID = 1L;
        private String name;
    
        // 用户登录
        public String login() {
            return SUCCESS;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }

    写一个过滤器

    package com.aaron.action;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.StrutsStatics;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class AuthorityInterceptor extends AbstractInterceptor {
        private static final long serialVersionUID = 1L;
        // 拦截Action处理的拦截方法
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("进入拦截器》》》》》》》");
            ActionContext ac=invocation.getInvocationContext();
            //struts2 拦截器Interceptor中取得request
            HttpServletRequest request=(HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);
            // 取出名为user的Session属性
            String name = request.getParameter("name");
            try{
                System.out.println("得到的用户名是:  "+name);
            }catch(Exception ex){
                System.out.println("异常: "+ex.toString());
            }
            // 如果没有登陆,或者登陆所用的用户名不是aaron,都返回重新登陆
            if (name != null && name.equals("aaron")) {
                request.getSession().setAttribute("msg", "登录成功");
                request.getSession().setAttribute("name", name);
                return invocation.invoke();
            }
            //ctx.put("msg", "没有权限,重新登录");
            request.getSession().setAttribute("msg", "没有权限,重新登录");
            
            // 直接返回login的逻辑视图
            return Action.LOGIN;
        }
    } 

    这里直接判断用户名是否符合要求。

    PS:struts2 拦截器Interceptor中取得request: HttpServletRequest request = (HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);


    配置struts.xml文件

    <?xml version="1.0"?>
                <!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.i18n.reload" value="false" />
        <constant name="struts.devMode" value="false" />
    
        <package name="default" extends="struts-default" namespace="/">
            <!-- 用户拦截器定义在该元素下 -->
            <interceptors>
                <!-- 定义了一个名为checkUserLogin的拦截器 -->
                <interceptor name="checkUserLogin" class="com.aaron.action.AuthorityInterceptor" />
                <interceptor-stack name="checkUserLogin_stack">
                    <!-- 应用默认拦截器堆栈 一定要有 -->
                    <interceptor-ref name="defaultStack" />
                    <!-- 应用自定义拦截器 -->
                    <interceptor-ref name="checkUserLogin" />
                </interceptor-stack>
            </interceptors>
            <!-- 定义默认拦截器 -->
            <default-interceptor-ref name="checkUserLogin" />
            <!-- 定义全局处理结果 -->
            <global-results>
                <result name="login">login.jsp</result>
            </global-results>
            <action name="login" class="com.aaron.action.UserAction"
                method="login">
                <result name="success">success.jsp</result>
                <result name="login">login.jsp</result>
            </action>
    
        </package>
    
    </struts>

    测试

    除了aaron用户名可以登录,输入其他用户名显示的都是“没有权限,重新登录”。

  • 相关阅读:
    麦肯锡-不录取全能的平庸之才
    压力测试工具tsung
    Rebar:Erlang构建工具
    Recon-Erlang线上系统诊断工具
    cowboy-高性能简洁的erlang版web框架
    初次使用erlang的concurrent
    [JSP]自定义标签库taglib
    [JavaEE笔记]Cookie
    Java中的访问控制权限
    [Servlet] 初识Servlet
  • 原文地址:https://www.cnblogs.com/haaron/p/5123624.html
Copyright © 2011-2022 走看看