strut2拦截器详解

来源:互联网 发布:年龄大可做网络主播吗 编辑:程序博客网 时间:2024/05/16 10:30

拦截器是Struts 2的一个强有力的工具。前面我们提到,正是大量的内置拦截器完成了Struts框架的大部分操作,像params拦截器将http请求中参数解析出来赋值给Action中对应的属性;Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action;以及前面讲过的国际化、转换器,校验等等。

1.使用struts2默认的interceptor实例:

strut2中有一个tokenSession的默认拦截器(这个拦截起作用:若用户多次输入,则除第一次输入之外的输入都无效,即只处理第一次请求)

A.配置strut.xml文件如下:

<action name="reg" class="com.chinasei.struts2.RegAction">

<interceptor-ref name="tokenSession"/>

<result name="invalid.token">/reg.jsp</result>

   <result name="success">/reg.jsp</result>

</action>

B.com.chinasei.struts2.RegAction.java文件如下:

package com.chinasei.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class RegAction extends ActionSupport{

   public String execute(){

    try{

    addActionMessage("注册成功!");

    Thread.sleep(2000);

       }

    catch(InterruptedException e){

       }

    return SUCCESS;}}

Creg.jsp文件如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<s:actionerror/>

<s:actionmessage/>

<s:form action="reg">

<s:token/>//这个地方是必须的,加入token标签

<s:textfield name="userName" label="帐号"/>

<s:password name="userPassword" label="输入密码"/>

<s:submit value="注册"/>

</s:form>

2.使用自定义的拦截器:

A:配置strut.xml

<package name="loginCode" extends="struts-default">

<interceptors>

<interceptor name="checkLogin" class="com.chinasei.struts2.CheckLoginInterceptor"/>

<interceptor-stack name="checkLoginStack">

<interceptor-ref name="checkLogin"/></interceptors>

   <actionname="login"class="com.chinasei.struts2.LoginAction">

   <result name="success">/loginSuccess.jsp</result>

<result name="input">/login.jsp</result>

<interceptor-ref name="checkLogin"/>

<interceptor-ref name="defaultStack"/>

</action>

<action name="test" class="com.chinasei.struts2.TestAction">

   <result name="success">/testSuccess.jsp</result>

<result name="input">/login.jsp</result>

<interceptor-ref name="checkLogin"/>

            <interceptor-ref name="defaultStack"/>

</action>

    (也可以把上述两个拦截器或拦截器栈放在一个自定义的拦截器栈中)   

B.login.jsp如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<s:actionerror/>

<s:actionmessage/>

<s:form action="login" method="post">

<s:textfield name="userName" label="帐号"/>

<s:password name="userPassword" label="密码" showPassword="true"/>

<s:submit value="登录"/>

</s:form>

<s:a action="test">未登录时,自定义拦截器测试!</s:a>

Ccom.chinasei.struts2.CheckLoginInterceptor.java(非常重要,为自己定义的拦截器)

package com.chinasei.struts2;

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.interceptor.Interceptor;

public class CheckLoginInterceptor implements Interceptor {

public void destroy() {

}

public void init() {

}

public String intercept(ActionInvocation actionInvocation) throws Exception {

System.out.println("这是自定义拦截器!");

//获得被拦截的Action的引用

Object action = actionInvocation.getAction();

if (action instanceof LoginAction){

System.out.println("这是登录用的Action,不调用自定义拦截器,直接调用后面的拦截器!");

return actionInvocation.invoke();

}

//确认Session中是否存在LOGIN

Map session = actionInvocation.getInvocationContext().getSession();

String login = (String)session.get("loginFlag");

if (login != null && login.equals("login")){

System.out.println("已经登录,调用后面的拦截器!");

return actionInvocation.invoke();

}

else{

//终止后续操作

System.out.println("还没有登录,停止调用后面的拦截器,返回登录页面!");

((ActionSupport) action).addActionMessage("您还没有登录,请先登录!");

return "input";

}

}

}

Dcom.chinasei.struts2.LoginAction.java如下

package com.chinasei.struts2;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements SessionAware{

private String userName;

private String userPassword;

private Map mySession;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserPassword() {

return userPassword;

}

public void setUserPassword(String userPassword) {

this.userPassword = userPassword;

public String execute(){

if(getUserName().equals("Wangjg") && getUserPassword().equals("Wangjg")){

addActionMessage("恭喜您,登录成功!");

mySession.put("loginFlag", "login");

return SUCCESS;

}

else{

addActionError("帐号或密码错误!");

return INPUT;

}

}

public void setSession(Map session) {

mySession = session;

}

}

EloginSuccess.jsp如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<s:actionmessage/>

您的帐号是:<s:property value="userName"/><br>

您的密码是:<s:property value="userPassword"/><br>

<br>

<s:a action="test">成功登录后,自定义拦截器测试!</s:a>

Fcom.chinasei.struts2.TestAction.java如下:

package com.chinasei.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport{

public String execute(){

return SUCCESS;

}

}

GtestSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

已登录的标识内容是:<s:property value="#session['loginFlag']"/>

H:注意params拦截器

<interceptor-stack name="myBasicStack">

 <interceptor-ref name="checkbox"/>      

     <interceptor-ref name="params"/>

</interceptor-stack>

作用是:从需要从jsp页面复选框获取属性checkboxTest的值时用到。