Struts2拦截器检测非法请求踢出登录

常规的WEB工程前后台都会设置相关校验规则,并且保持一致。因此服务端收到不符合校验的参数表示该请求存在恶意篡改行为,应当限制并踢出登录

所属分类 JAVA

相关标签 Struts请求安全

拦截器

Struts2 校验框架可以进入 Action 之前进行后端的参数校验功能,当出现非法请求时仅仅返回参数不合法是不够的。

满足更高的安全要求,如果出线参数不合法,说明该请求不是预期的界面请求。

应当将该用户踢出登录,甚至考虑锁定一段时间,该操作需要应用到拦截器相关能力。

Interceptor s(拦截器) 拦截器体系是Struts2框架的重要组成部分。

Struts2 中提供的很多特性都是通过拦截实现的,其主要目的就是为了保证服务端的正常运行,避免非法请求的介入等。

拦截器存在的位置在进入 Action 之前的 Request 处理,以及 Action 结束的返回 Result 处理。

这听起来和过滤器很类似,但是过滤器是处于流程的更外一层。

比如实现后台校验不通过时踢出登陆,那么需要在在 Action 层完成后增加对应的处理逻辑。

配置拦截器

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="mebugs" extends="struts-default">
    <interceptors>
        <interceptor name="getoutFromError" class="com.mebugs.struts2.GetOutFromErrorInterceptor" />
        <!-- interceptor-stack标签中可以配置多个拦截器,便于action的配置 -->
        <interceptor-stack name="mebugsActStack">
            <interceptor-ref name="getoutFromError" />
            <interceptor-ref name="...other..." />
        </interceptor-stack>
    </interceptors>
    <!-- 指定需要的拦截器 -->
    <action name="createRuningMan" class="com.mebugs.team.RunningManAction" method="createRuningMan">
        <interceptor-ref name="params"/>
        <interceptor-ref name="mebugsActStack" />
    </action>
</package>
</struts>
package com.mebugs.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class GetOutFromErrorInterceptor extends AbstractInterceptor 
{  
    private static final long serialVersionUID = 1L;
    public String intercept(ActionInvocation invocation) throws Exception 
    {
        String result = null;
        //独立于after和begin之外的拦截器操作
        invocation.addPreResultListener(new PreResultListenerImpl());
        try 
        {
            result = invocation.invoke();
        }
        catch (Exception e) 
        {
            //LOG处理
        }
        return result;
    }
}

完成校验非法踢出的详细操作

package com.mebugs.struts2.validation;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;
public class PreResultListenerImpl implements PreResultListener 
{
    @SuppressWarnings("rawtypes")
    public void beforeResult(ActionInvocation invocation, String arg1) 
    {
        //从Action的返回体中寻找是否有校验不合法的内容
        Map fieldErrors = (Map) invocation.getInvocationContext().getValueStack().findValue("fieldErrors");
        if (null != fieldErrors) 
        {
            //非法内存存在,后台注销Session
            Iterator it_key = fieldErrors.keySet().iterator();
            if (it_key.hasNext()) 
            {
                invocation.getInvocationContext();
                HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);          
                request.getSession().invalidate();
            }
        }
    }
}

ActionInvocation 中的方法,ActionInvocation 是 Action 调度者,这个方法具备2层含义:

  1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
  2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。
  • Action 之前,拦截器的执行顺序与堆栈中定义的一致。
  • Action 和 Result 之后,拦截器的执行顺序与堆栈中定义的顺序相反。

拦截器的核心部分是 invocation.invoke() 这个函数的调用位置。

根据这句代码的调用位置,来进行拦截类型的区分的。

在Struts2中,Interceptor的拦截类型,分成以下三类:

  1. before 拦截,存在于 invocation.invoke() 代码执行之前。这些代码,将依照拦截器定义的顺序,顺序执行。

  2. afte r拦截,存在于invocation.invoke()代码执行之后。这些代码,将依照拦截器定义的顺序,逆序执行。

  3. PreResultListener 拦截,before 拦截和 after 拦截对我们来说是不够的,特别针对在Action执行完之后,没有回到视图层之前,做一些事情。

    Struts2同样支持这样的拦截,这种拦截方式,是通过在拦截器中注册一个 PreResultListener 的接口来实现的。

    如上述:PreResultListenerImpl 实现了 PreResultListener 接口并在 beforeResult 方法中做了踢出登录逻辑,然后在拦截器类中加入action.addPreResultListener(new MyPreResultListener());

小结

因此,Struts2的Action层的4个不同的层次,他们分别是:拦截器(Interceptor)、Action、PreResultListener 和 Result。

在上诉实例中有着准确的展示!

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

JAVA

listener、filter、servlet的加载次序

在web.xml中经常会看到listener,filter,servlet的相关标签配置,它们分别是监听器、过滤器、容器,都是在项目启动的时候就可以进行初始化的加载动作

JAVA中创建线程的三种方式的使用与区别

JAVA中通过继承Thread类、实现Runnable接口以及实现Callable接口配合Future接口实现创建多线程,三种方式各有优缺点,而第三种则具备更多的增强能力

SpringBoot配置文件生效优先级

SpringBoot 可以通过 spring.profiles.active 属性指定生效不同配置文件来满足多环境要求,多环境更为复杂的场景,就需要理解配置文件生效优先级,考虑直接引入外部配置项和配置文件

自定义filter过滤器拦截未登录(非法)请求

在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理

Maven的pom配置文件的scope属性

scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。

JAVA语言中的反射机制的作用原理及使用

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;动态获取的信息以及动态调用对象的方法的功能。

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核