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拦截器进行防止表单重复提交了,我们可以在试验的时候查看源代码,可以看到相关的隐藏字段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容