struts2 18拦截器详解(四) --- ServletConfigInterceptor

ServletConfigInterceptor


   ServletConfigInterceptor拦截器处理defaultStack第三的位置,可以说这个拦截器是18拦截器中逻辑最简单的一个,就是给Action提供一种获取运行参数的一种方式,如果request,session,application,通过该拦截器,只要Action实现相应的接口就可以获得这些对象。
下面是该拦截器intercept方法源码:

public String intercept(ActionInvocation invocation) throws Exception {
        final Object action = invocation.getAction();//获取当前正在执行的Action
        final ActionContext context = invocation.getInvocationContext();//获取ActionContext对象
		//判断当前Action是否实现了ServletRequestAware接口
        if (action instanceof ServletRequestAware) {
        	//如果实现了则将HttpServletRequest对象通过Action的setServletRequest传递给Action
            HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
            ((ServletRequestAware) action).setServletRequest(request);
        }
		//与上同理
        if (action instanceof ServletResponseAware) {
            HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE);
            ((ServletResponseAware) action).setServletResponse(response);
        }
		//与上同理
        if (action instanceof ParameterAware) {
            ((ParameterAware) action).setParameters((Map)context.getParameters());
        }
		//与上同理
        if (action instanceof ApplicationAware) {
            ((ApplicationAware) action).setApplication(context.getApplication());
        }
        //与上同理
        if (action instanceof SessionAware) {
            ((SessionAware) action).setSession(context.getSession());
        }
        //与上同理,只不过这里传递的是Map类型的request对象
        if (action instanceof RequestAware) {
            ((RequestAware) action).setRequest((Map) context.get("request"));
        }
		//与上同理
        if (action instanceof PrincipalAware) {
            HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
            if(request != null) {
                // We are in servtlet environment, so principal information resides in HttpServletRequest
                ((PrincipalAware) action).setPrincipalProxy(new ServletPrincipalProxy(request));
            }
        }
        //与上同理
        if (action instanceof ServletContextAware) {
            ServletContext servletContext = (ServletContext) context.get(SERVLET_CONTEXT);
            ((ServletContextAware) action).setServletContext(servletContext);
        }
        return invocation.invoke();//调用下一个拦截器
    }

   在ActionContext对象中,即能获取HttpServletRequest对象,也能获取struts2根据HttpServletRequest对象生成的Map对象(如果对这个不大清楚请参看struts2处理请求流程详解),所以在这里struts2提供的aware接口也有两种一种是Servlet API对象,一种是struts2自定义的Map对象。对于实现了PrincipalAware接口的Action,struts2会把request封装在一个PrincipalProxy代理对象中,以方便获取请求安全方面的信息,PrincipalProxy只是一个代理,其内部还是调用的request对象的相关方法。

   这几个判断完成后继续调用下一个拦截器......

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值