AJAX请求时strtus的拦截方式

本文介绍如何使用Spring AOP技术实现Struts Action的用户登录验证功能。通过配置拦截器检查用户登录状态,并针对不同请求类型进行相应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用spring代理struts的Action,在使用spring创建的bean时执行一次验证拦截器来判断用户是否登录
package net.yanhl.struts.authority;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import net.yanhl.util.UserUtil;
 
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.struts.action.ActionMapping;
 
/**
 *Title: 判断用户是不是已经登陆
 *Description:
 *Copyright: Copyright (c) 2008
 *
 * @author 闫洪磊
 * @version 1.0.0.20080523
 */
public class UserAuthorityInterceptor implements MethodInterceptor {
        public Object invoke(MethodInvocation invocation) throws Throwable {
                HttpServletRequest request = null;
                HttpServletResponse response = null;
                ActionMapping mapping = null;
                Object[] args = invocation.getArguments();
                //转换各种对象
                for (int i = 0; i < args.length; i++) {
                        if (args[i] instanceof HttpServletRequest) {
                                request = (HttpServletRequest) args[i];
                        } else if (args[i] instanceof HttpServletResponse) {
                                response = (HttpServletResponse) args[i];
                        } else if (args[i] instanceof ActionMapping) {
                                mapping = (ActionMapping) args[i];
                        }
                }
                if (UserUtil.isLogin(request)) {
                        return invocation.proceed();
                } else {
                        /*
                         * 判断是哪种类型的请求(普通URL、AJAX)
                         * 如果是AJAX的输出一个login字符串
                         * 如果是普通页面直接跳转到登录页面
                        */
                        String requestType = request.getHeader("X-Requested-With");
                        if(requestType != null && requestType.equals("XMLHttpRequest")) {
                                response.getWriter().print(UserUtil.FORWARD_LOGIN);
                                return null;
                        } else {
                                return mapping.findForward(UserUtil.FORWARD_LOGIN);
                        }
                }
        }
}

基本功能就是检查用户是否已经登录

  • 配置拦截路径

    <!--  用户权限拦截器生成代理  -->
        <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames">
                <list>
                   <!-- 需要拦截检查用户登录的action,这些action已经在 spring配置 -->
                    <value>/field/*</value>
                    <value>/price/*</value>
                    <value>/locale/*</value>
                </list>
                </property>
            <property name="interceptorNames">
                <list>
                    <value>userAuthorityInterceptor</value> 
                </list>
            </property>
        </bean>
     
        <!-- 定义用户权限检查拦截器 -->
            <bean id="userAuthorityInterceptor" class="net.yanhl.struts.authority.UserAuthorityInterceptor"/>
    

    这里主要是配置拦截URL路径,进入ACTION之前会先进入UserAuthorityInterceptor判断用户是否登录

  • 前端JS文件

    这是我们要设置全局的一个ajaxSetup来控制所有ajax请求,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    $.ajaxSetup({
                    cache : false,
                    global : true,
                    complete: function(req, status) {
                            var reqText = req.responseText;
                            // 如果后台返回的是login字符串则可以跳转到登录页面
                            if(reqText && reqText == 'login'){
                                    var topWinObj = getTopWin();
                                    topWinObj.location.href = '/exercise/login.html';
                            }
                    }
            });
    /**
     * 获得最上层的window对象
     */
    function getTopWin() {
            if(parent) {
                    var tempParent = parent;
                    while(true) {
                            if(tempParent.parent) {
                                    if(tempParent.parent == tempParent) {
                                            break;
                                    }
                                    tempParent = tempParent.parent;
                            } else {
                                    break;
                            }
                    }
                    return tempParent;
            } else {
                    return window;
            }
    }
    

    OK,启动服务测试,在没有登录的情况下打开主页面,执行一个保存动作发现直接跳转到了登录页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值