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层含义:
拦截器的核心部分是 invocation.invoke() 这个函数的调用位置。
根据这句代码的调用位置,来进行拦截类型的区分的。
在Struts2中,Interceptor的拦截类型,分成以下三类:
before 拦截,存在于 invocation.invoke() 代码执行之前。这些代码,将依照拦截器定义的顺序,顺序执行。
afte r拦截,存在于invocation.invoke()代码执行之后。这些代码,将依照拦截器定义的顺序,逆序执行。
PreResultListener 拦截,before 拦截和 after 拦截对我们来说是不够的,特别针对在Action执行完之后,没有回到视图层之前,做一些事情。
Struts2同样支持这样的拦截,这种拦截方式,是通过在拦截器中注册一个 PreResultListener 的接口来实现的。
如上述:PreResultListenerImpl 实现了 PreResultListener 接口并在 beforeResult 方法中做了踢出登录逻辑,然后在拦截器类中加入action.addPreResultListener(new MyPreResultListener());
因此,Struts2的Action层的4个不同的层次,他们分别是:拦截器(Interceptor)、Action、PreResultListener 和 Result。
在上诉实例中有着准确的展示!
当前还没有观点发布,欢迎您留下足迹!
Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程
SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It
Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。