博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2 拦截器处理普通Http请求和Ajax请求时拦截配置
阅读量:4842 次
发布时间:2019-06-11

本文共 4330 字,大约阅读时间需要 14 分钟。

转载自网址:http://www.2cto.com/kf/201311/260303.html;

 

近期发现以前的中存在一个如下的Bug Case:

      在Session过期时,执行页面的ajax请求时,无法正常跳转到session过期提示页面,系统直接hold在那里不动,只有点击左侧菜单时,系统才能跳转到session过期提示页面。
      经过调研,发现是拦截器的处理问题,拦截器只拦截了Http请求,而没有拦截Ajax请求,才导致出现上述Bug。
      下面是解决办法:
      首先,优化拦截器:
     
[java] 
/** 
 * 拦截器 
 * @author lyh 
 * @version 2013-11-1 
 * @see LoginFilter 
 * @since 
 */  
public class LoginFilter implements Interceptor  
{  
  
    /** 
     * 序列号 
     */  
    private static final long serialVersionUID = -4979037503367919375L;  
  
    /** 
     * 日志 
     */  
    private static final Logger LOG = Logger.getLogger(LoginFilter.class);  
  
    /** 
     * ajax session超时返回值 
     */  
    private static String AJAX_TIME_OUT = null;  
  
    /** 
     * ajax 请求无权限返回值 
     */  
    private static String AJAX_NO_LIMIT = null;  
  
    /** 
     * ajax 请求异常返回值 (在每个ajax请求中处理) 
     */  
    //private static String AJAX_EXCEPTION = null;  
  
    /** 
     * 放行url 
     */  
    private static List<String> awayUrls = null;  
  
    static  
    {  
        AJAX_TIME_OUT = "ajaxSessionTimeOut";  
        AJAX_NO_LIMIT = "ajaxNoLimit";  
        //AJAX_EXCEPTION = "ajaxException";  
  
        awayUrls = new LinkedList<String>();  
        //awayUrls.add("/login!userLogin.action");  
        //awayUrls.add("/custom!toLogin.action");  
        awayUrls.add("/equipment!upLoad.action");  
    }  
  
    @Override  
    public String intercept(ActionInvocation invocation)  
        throws Exception  
    {  
        //获取request域中信息  
        HttpServletRequest req = ServletActionContext.getRequest();  
  
        //获得当前请求url  
        String url = req.getServletPath();  
  
        //获得请求类型  
        String type = req.getHeader("X-Requested-With");  
  
        //Object object = (Object)invocation.getAction();  
  
        //如果当前url在放行url集合内 则直接放行   
        if (!awayUrls.contains(url))  
        {  
            UserInfoBean userinfo = (UserInfoBean)req.getSession().getAttribute(  
                CommonConstant.AUTH_SESSION_USER_KEY);  
  
            if (userinfo == null)  
            {  
                LOG.debug("用户登录会话已过期!");  
  
                //ajax请求 session过期时 返回字符串  
                if ("XMLHttpRequest".equalsIgnoreCase(type))  
                {  
                    PrintWriter printWriter = ServletActionContext.getResponse().getWriter();  
                    printWriter.print(AJAX_TIME_OUT);  
                    printWriter.flush();  
                    printWriter.close();  
  
                    return null;  
                }  
                //普通http请求 直接返回页面  
                else  
                {  
                    return "sessionTimeOut";  
                }  
            }  
            else  
            {  
                //鉴权结果  
                boolean authFlag = false;  
                try  
                {  
                    //执行鉴权  
                    authFlag = userManager_Service.isUrlInUserLimit(userinfo.getU_phone_num(),  
                        url);  
                }  
                catch (Exception e)  
                {  
                    LOG.error(" 鉴权出现异常!异常信息:" + e.toString() + ":" + e.getMessage());  
                }  
                //鉴权通过则放行  否则拦截  
                if (authFlag)  
                {  
                    return invocation.invoke();  
                }  
                //鉴权不通过  
                else  
                {  
                    //ajax请求 session过期时 返回字符串  
                    if ("XMLHttpRequest".equalsIgnoreCase(type))  
                    {  
                        PrintWriter printWriter = ServletActionContext.getResponse().getWriter();  
                        printWriter.print(AJAX_NO_LIMIT);  
                        printWriter.flush();  
                        printWriter.close();  
  
                        return null;  
                    }  
                    //其他Http请求 直接返回页面  
                    else  
                    {  
                        return "noLimit";  
                    }  
                }  
            }  
        }  
        else  
        {  
            return invocation.invoke();  
        }  
    }  
  
    @Override  
    public void destroy()  
    {  
        //do yourself  
    }  
  
    @Override  
    public void init()  
    {  
        //do yourself  
    }  
  
}  
 
       上述拦截器考虑了Ajax和Http两种情况,Http请求被拦截时,直接跳转到指定的全局页面,而Ajax请求被拦截时则采用Js方式提示用户。
[html] 
<package name="self-default" extends="json-default">  
          
        <interceptors>  
            <interceptor name="loginFilter" class="xx.xx.LoginFilter" />  
              
            <interceptor-stack name="mydefault">  
                <interceptor-ref name="defaultStack"/>  
                <interceptor-ref name="tokenSession">  
                    <param name="includeMethods">add*,update*,modify*,upload*</param>  
                </interceptor-ref>  
                <interceptor-ref name="loginFilter" />  
            </interceptor-stack>  
        </interceptors>  
          
        <!-- 拦截器应用到全部action -->  
        <default-interceptor-ref name="mydefault"/>  
           
        <global-results>  
            <!-- 普通http请求时  系统出现异常返回到错误页   -->  
            <result name="exception">/file/smartmanager/public/globalException. </result>  
              
            <!-- 普通http请求时  无操作权限   -->  
            <result name="noLimit">/file/smartmanager/public/noLimit.jsp</result>  
              
            <!-- 普通http请求时  session过期  -->  
            <result name="sessionTimeOut">/file/smartmanager/public/sessionTimeOut.jsp</result>  
        </global-results>  
  
        <global-exception-mappings>  
            <!-- 全局异常返回exception字符串 -->  
            <exception-mapping exception="java.lang.Exception" result="exception" />  
        </global-exception-mappings>  
          
    </package>  
        下面是一个简单的Action例子:
[java]  
public class MyAction  
{  
  
    /** 
     * Http请求 
     * @return 
     * @throws Exception  
     * @see 
     */  
    public String httpReqMethod()  
        throws Exception  
    {  
        try  
        {  
            //do yourself  
        }  
        catch(Exception e)  
        {  
            //捕获异常时抛出  触发global-results中的exception 然后跳转到提示页面  
            throw e;  
        }  
          
        return "httpReqMethod";  
    }  
      
    /** 
     * Ajax请求 
     * @return 
     * @throws Exception  
     * @see 
     */  
    public String ajaxReqMethod()  
    {  
        try  
        {  
            //do yourself  
        }  
        catch(Exception e)  
        {  
            //no throw  
            //此处在捕获异常时 添加提示信息至json 方便在页面展示  
            //ajaxMap.put("success", false);  
            //ajaxMap.put("opMsg", ResultMsg.CHANGE_PWD_ERROR);  
        }  
  
        return "ajaxReqMethod";  
    }  
}  
      

转载于:https://www.cnblogs.com/zw-shi/p/6097559.html

你可能感兴趣的文章
C++中static用法
查看>>
Selenium——selenium之利用excel实现参数化
查看>>
2535-springsecurity系列--关于授权角色“ROLE”前缀的问题
查看>>
自己动手写OpenStack的QoS功能(4)
查看>>
IDEA快捷键
查看>>
【tmos】spring boot项目中处理Schedule定时任务
查看>>
Nginx+certbot 实现泛域名的https证书
查看>>
python实现链表(一)
查看>>
多层下firebird自增长字段的处理
查看>>
JS输入输出等补充
查看>>
转android四种动画
查看>>
初学android:四大组件之contentprovider
查看>>
1289大鱼吃小鱼(STL中栈的应用)
查看>>
POJ3177 Redundant Paths
查看>>
初学树
查看>>
Hibernate延迟加载
查看>>
在子页面使用layer弹出层时只显示遮罩层,不显示弹出框问题
查看>>
<吴恩达老师深度学习笔记一>深度学习概述
查看>>
smarty 模板标签
查看>>
第二阶段团队冲刺(十)
查看>>