Struts2之拦截器篇

栏目: Struts · 发布时间: 7年前

内容简介:Struts2之拦截器篇

拦截器是Struts2框架的核心和基础,Struts2绝大多数功能都是通过拦截器来完成的,当StrutsPrepareAndExecuteFilter拦截到用户请求后,大量拦截器会对该请求进行处理,然后才调用用户自定义的Action类中的方法进行处理请求,由此可见,拦截器是Struts2的核心所在。

Struts2框架内建了大量的拦截器,我们可以在struts-default.xml中进行查看:

Struts2之拦截器篇

那么这些内置拦截器的具体作用是什么呢?

alias

实现在不同请求中相似参数别名的转换

autowiring

这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的 Bean

chain

构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type="chain" .../>一起使用

conversionError

这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误

createSession

该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中

debugging

当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息

execAndWait

后台执行Action,负责将等待画面发送给用户

exception

这个拦截器负责处理异常,它将异常映射为结果

fileUpload

这个拦截器主要用于文件上传,它负责解析表单中文件域的内容

i18n

这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中

logger

这是一个负责日志记录的拦截器,主要是输出Action的名字

model-driven

这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中

params

这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值

prepare

如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。

static-params: 这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action

scope

这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内

servlet-config

如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。

注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合

roles

这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action

timer

这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。

token

这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。

token-session

这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中

validation

通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验

workflow

这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图

scoped-model-driven

如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例

接下来我们以token这一内置的拦截器为例来看看Struts2中拦截器的应用(token拦截器用来处理用户重复提交的页,以防止错误发生):

首先配置struts开发环境,上一篇:Struts2框架基础篇中有介绍,这里不重复说。

写一个登录页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>Login</title>
  </head>
  
  <body>
    <s:form action="login" method="post">
    	<s:token></s:token>
    	<s:textfield name="username" label="username"></s:textfield>
    	<s:password name="password" label="password"></s:password>
    	<s:submit value="login"></s:submit>
    </s:form>
  </body>
</html>

编写action:

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	
	private static final long serialVersionUID = 7222063566979612268L;
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

}

接着在struts.xml中配置action及拦截器:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置struts可以受理的请求扩展名 ,这是默认的-->
<constant name="struts.action.extension" value="action,,"></constant>
	<package name = "hello" extends = "struts-default" namespace = "/">
		<action name="login" class="org.interceptor.LoginAction">
			<result>/success.jsp</result>
			<result name="invalid.token">/error.jsp</result>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<!-- defaultStack 是系统默认的拦截器栈,会自动应用,这里手动配置的原因是当为一个action配置拦截器
			时,默认的拦截器就不起作用了,所以必须显示的配置这个拦截器栈 -->
			<interceptor-ref name="token"></interceptor-ref>
		</action>
	</package>
</struts>

最后,为了测试,编写一个成功界面以及重复提交被拦截界面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>welcome</title>
  </head>
  
  <body>
  	欢迎<s:property value="username"/>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>wrong</title>
  </head>
  
  <body>
  	请不要重复提交
  </body>
</html>

测试运行:

输入用户名密码:

Struts2之拦截器篇

点击login:

Struts2之拦截器篇

刷新或者返回再次点击login,此时的操作会被拦截器拦截:

Struts2之拦截器篇

这样,用内置拦截器比较容易的就解决了表单重复提交的问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具