12.拦截器(struts2笔记)

主要内容:

  • 自定义拦截器
  • 使用struts2自带的拦截器

一、自定义拦截器

这里讲自定义拦截器主要是为了理解struts2的一些原理,在实际开发中可能很少用到自定义拦截器。
(工程struts2_3500_my_interceptor
首先实现一个基本的功能
TestAction.java

package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
    
    private String username;
    private String password;
    public String login() throws Exception {
        
        return "success";
    }
    
    public String input() {
        return "input";
    }

    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;
    }

}

然后我们去访问这个action,访问完之后返回到一个页面。
struts.xml

<?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>
    <constant name="struts.devMode" value="true"></constant>
    <package name="test" namespace="/" extends="struts-default" >
    
        <interceptors>
            <interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
        </interceptors>
        
        <action name="test" class="com.bjsxt.action.TestAction">
            <result>/test.jsp</result>
            <interceptor-ref name="my"></interceptor-ref>
            <!-- 如果不加原来默认的拦截器,那么自定义拦截器就会将其覆盖,所以默认的拦截器需要加上 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
      
</struts>

我们在访问此action的过程中使用一个拦截器
MyInterceptor.java

package com.bjsxt.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {

    @Override
    public void destroy() { 
    }

    @Override
    public void init() {

    }

    @Override
    public String intercept(ActionInvocation invovation) throws Exception {
        
        long start = System.currentTimeMillis();
        String r = invovation.invoke();
        long end = System.currentTimeMillis();
        System.out.println("action time = " + (end - start));
        return r;
    }
}

说明:拦截器的功能很简单,就是打印拦截器使用的时间,注意继承Interceptor接口。拦截器定义好之后我们还需要在配置文件中进行配置:

<interceptors>
            <interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
        </interceptors>

这里是配置拦截器,但是配置了拦截器还要让其起作用,这里我们要在特定的action中进行配置:

<interceptor-ref name="my"></interceptor-ref>
<!-- 如果不加原来默认的拦截器,那么自定义拦截器就会将其覆盖,所以默认的拦截器需要加上 -->
<interceptor-ref name="defaultStack"></interceptor-ref>

需要知道的是我们需要将默认的拦截器也要配置,不然会被覆盖。

然后我们访问action就会看到打印的信息。

二、使用token拦截器控制重复提交

在将JavaEE基础的时候我们将过防止重复提交的方法,就是往session中存入一个隐藏字段,然后在后台进行比较。这里struts2中也是使用的这个方法,但是这个拦截器没有配置到默认拦截器中,因为使用的很少,我们看看如何使用。(工程struts2_3600_token_interceptor

首先我们访问InputAction

package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class InputAction extends ActionSupport {
    
    @Override
    public String execute() throws Exception {
        
        return super.execute();
    }   
}

然后会返回到input.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <form action="user" method="post">
        name:<input name="name">
        age:<input name="age">
        <input type="submit" value="add">
        <s:token></s:token>
    </form><br>
  </body>
 </html>

提交的时候访问UserAction

package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
    
    private String name;
    private int age;
    
    @Override
    public String execute() throws Exception {
        System.out.println("a user added!");
        return super.execute();
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

基本过程就是这样,我们看配置文件struts.xml

<?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>

    <constant name="struts.devMode" value="true"></constant>
    <package name="test" namespace="/" extends="struts-default">
        
        <action name="input" class="com.bjsxt.action.InputAction">
            <result>/input.jsp</result>
        </action>

        <action name="user" class="com.bjsxt.action.UserAction">
            <result>/addOK.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <result name="invalid.token">/error.jsp</result>
        </action>

    </package>
</struts>

可以看到我们是在action的返回结果后面配置了

<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/error.jsp</result>

这样就可以使用token拦截器进行防止表单重复提交了,我们可以在试验的时候查看源代码,可以看到相关的隐藏字段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传...
    重山杨阅读 3,925评论 2 13
  • 详谈 Struts2 的核心概念 本文将深入探讨Struts2 的核心概念,首先介绍的是Struts2 的体系结构...
    可爱傻妞是我的爱阅读 1,112评论 0 2
  • 原创版权申明:本文章从本人 csdn 博客转到简书。如有转载,请申明:转载自 IT天宇:http://www.ji...
    IT天宇阅读 860评论 0 15
  • action中如何接受页面传过来的参数 第一种情况:(同名参数) 例如:通过页面要把id=1 name=tom a...
    清枫_小天阅读 2,936评论 1 22
  • 害怕你明白,也害怕你不经心。 天似乎要下雨,其实是幌子。 时间被我肢解然后抛弃,我也时常回头叹息。浑浑噩噩的话说千...
    蝾离阅读 221评论 0 1