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

Spring、SpringMVC和SpringBoot

Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?

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

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

一文理解SpringMVC框架核心

SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程

SpringBoot配置druid(德鲁伊)数据库连接池

SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It

Struts2 + Spring框架融合配置

Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例

Maven的pom配置文件的scope属性

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

选择个人头像

昵称

邮箱

QQ

网址

评论提示

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