Java中的Struts2框架拦截器之实例代码

本文实例为大家分享了Struts2框架拦截器实例的示例代码,供大家参考,具体内容如下

在看拦截器的小例子的前我们先来看看sturts2的原理

struts2自己是有拦截器的,通过拦截器可以拦截用户请求,并作出处理

拦截器作用有很多,譬如:

1.Action里面有个属性,这个属性我想在action执行之前改成别的值,可以用拦截器解决。

2.比如每个人执行action之前,我可以查看他们有没有这个权限执行这个action。
如果不设置拦截器,你要在每种action方法之前设置判定程序,非常繁琐。

拦截器interceptor体现了一种编程理念,叫做AOP(面向切面编程)

实例1:使用token拦截器控制重复提交

token是用来解决下面的问题:

一旦有人通过表单提交数据,在提交表单的时候页面提交速度太慢,用户一直不停的刷新,如果不做一种机制防止他刷新的话,那么数据库中就会多出好多垃圾数据。

表单提交一般都要写成post(第一种解决方式,浏览器会提醒你是否重复提交)

拦截器解决方法:

struts2定义了一个拦截器(interceptor)叫--token

token的意思是“令牌”,你要提交数据,我先发给你一个令牌,你的令牌要是和我能对上,你就提交,对不上就不允许提交

token为什么可以防止重复提交?

答:当访问界面时,在服务器那边的session里面,生成一个随机数,然后再把随机数写到form里,提交数据时session就会被带到服务器去。提交完成后session里面的值被清空,再次重复提交的时候,发现此token值在session不存在,说明已经被提交过了,这个时候就会显示友好界面提示用户。

实现代码:

struts.xml:

<package name="test" namespace="/javaee" extends="struts-default">
 <action name="pinput" class="cn.edu.hpu.action.PinputAction">
 <result>/input.jsp</result>
 </action> 

 <action name="person" class="cn.edu.hpu.action.PersonAction">
 <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> 

PersonAction.java:

package cn.edu.hpu.action;
import com.opensymphony.xwork2.ActionSupport;
public class PersonAction extends ActionSupport {
 private String name;
 private int age; 

 @Override
 public String execute() throws Exception {
 System.out.println("a person 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;
 }
} 

input.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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%>" rel="external nofollow" >
 <title>My JSP 'input.jsp' starting page</title>
 </head> 

 <body>
 <form action="<%=basePath %>javaee/person" method="post">
 name:<input name="name">
 age:<input name="age">
 <input type="submit" value="add">
 </form><br/>
 </body>
</html>

addOK.jsp:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>My JSP 'addOK.jsp' starting page</title>
 </head>
 <body>
 add ok!! <br/>
 </body>
</html> 

error.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>My JSP 'error.jsp' starting page</title>
 </head>
 <body>
 严禁做重复的事!!! <br>
 </body>
</html> 

结果:

填写name与age之后,会跳入界面addOK.jsp,控制台会输出a person added!

返回再次提交时,就会跳转到error.jsp界面,无法重复提交

如果在表单中加<s:token></s:token>,则会看到源码:

<input type="hidden" name="struts.token.name" value="struts.token" />
<input type="hidden" name="struts.token" value="PZOQNKARYVQYDEVGNKTWFBF17735K6AI" />
<!--相当于生成了一个随机数--> 

所原理是:在提交页面形成了一个token,这个token在服务器端对应的session里面已经有了,当我一点提交的时候,由于加了<interceptor-ref name="token"></interceptor-ref>(token的拦截器),服务器就会帮我拦截,看看session里面有没有token的值,如果之前没有提交,session里面是有这个token值的,如果上次提交过了,session就会将token值清除掉。当发现页面的token值在服务器的session中找不到时,服务器发现出错了,重定向到error.jsp,显示错误信息

实例2:自定义拦截器

struts.xml:

<pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><?xml version="1.0" encoding="GBK" ?>
<!--指定struts2配置文件的DTD信息-->
<!DOCTYPE struts PUBLIC
"-//apache Software Foundation//DTD Struts Configuation 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- struts 是struts2配置文件的根元素--> 

<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--允许静态方法的执行-->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 

<package name="test" namespace="/" extends="struts-default">
 <interceptors>
 <interceptor name="my" class="cn.edu.hpu.interceptor.MyInterceptor"></interceptor>
 </interceptors> 

 <action name="test" class="cn.edu.hpu.action.TestAction">
 <result>/test.jsp</result>
 <interceptor-ref name="my"></interceptor-ref>
 <interceptor-ref name="defaultStack"></interceptor-ref>
 </action>
</package>
</struts> 

TestAction.java:

package cn.edu.hpu.action;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport{ 

 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  return super.execute();
 }
}

MyInterceptor.java:

package cn.edu.hpu.interceptor; 

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; 

public class MyInterceptor implements Interceptor{ 

 public void destroy() { 

 }
 public void init() { 

 } 

 //写好了一个拦截(计算了一个action运行的时间)
 public String intercept(ActionInvocation invocation) throws Exception {
 long start=System.currentTimeMillis();
 String r=invocation.invoke();
 long end=System.currentTimeMillis();
 System.out.println("Action Time="+(end-start));
 return r;
 } 

} 

访问:http://localhost:8080/struts2_LanJieQi/test后
控制台输出:
Action Time=200

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Struts2拦截器Interceptor的原理与配置实例详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

  • struts2拦截器_动力节点Java学院整理

    如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器): <interceptor-ref name="checkbox"> <param name="uncheckedValue">0</param> </interceptor-ref>

  • 详解Struts2拦截器机制

    Struts2的核心在于它复杂的拦截器,几乎70%的工作都是由拦截器完成的.比如我们之前用于将上传的文件对应于action实例中的三个属性的fileUpload拦截器,还有用于将表单页面的http请求参数设置成action中对应的属性的param拦截器等.总之,在整个Struts框架中拦截器的作用是相当大的,本篇将从以下几点详细介绍下有关Struts拦截器的内容: 拦截器在Struts中的作用 自定义拦截器实现类 配置拦截器(包含配置默认拦截器) 引用拦截器 配置拦截指定方法的拦截器 拦截器的拦

  • 防止未登录用户操作—基于struts2拦截器的简单实现

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect 到登录页面.然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp . 比如,我们将检查用户是否登录的代码放入一个jsp页面中,如 checkUser.jsp <%@

  • Struts2源码分析之ParametersInterceptor拦截器

    前言 ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Action中,如果栈顶是一个model(Action实现了ModelDriven接口)则把参数设置到了model中. 下面是该拦截器的doIntercept方法源码: @Override public String doIntercept(ActionInvocation invocation) throws Ex

  • struts2自定义拦截器的示例代码

    题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录) 定义拦截器 在struts.xml中定义拦截器使用标签<Intercaptors>.<Intercapter>. <interceptors> <interceptor name="test" class="Intercaptor.Intercaptor

  • Struts2拦截器 关于解决登录的问题

    拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次发送请求. 拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 我们可以让每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 接下来我们该如何定义一个拦截器: 自定义一个拦截器如下: 1.实现Interceptor接口或者继承AbstractInterceptor抽象类. 2

  • Struts2学习教程之拦截器机制与自定义拦截器

    前言 拦截器体系是Struts2框架的重要组成部分,不夸张的说,没有拦截器体系,也就没有这么好用的Struts2框架了.在Struts2框架中,大量的拦截器完成了很多基础的功能,比如,params拦截器负责解析HTTP请求的参数,并设置Action的属性:servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action:fileUpload拦截器则负责解析请求参数中的文件域,并将一个文件域设置成Actio

  • Java中的Struts2框架拦截器之实例代码

    本文实例为大家分享了Struts2框架拦截器实例的示例代码,供大家参考,具体内容如下 在看拦截器的小例子的前我们先来看看sturts2的原理 struts2自己是有拦截器的,通过拦截器可以拦截用户请求,并作出处理 拦截器作用有很多,譬如: 1.Action里面有个属性,这个属性我想在action执行之前改成别的值,可以用拦截器解决. 2.比如每个人执行action之前,我可以查看他们有没有这个权限执行这个action. 如果不设置拦截器,你要在每种action方法之前设置判定程序,非常繁琐. 拦

  • Java中初始化块详解及实例代码

    Java中初始化块详解 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量,即static修饰的数据成员. 非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量. 非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被运行. 括号里的是初始化块,这里面的代码在创建Java对象时执行,而且在构造器之前执行! 其实初始化块就是构造器的补充,初始化块是

  • java中volatile关键字的作用与实例代码

    一,什么是volatile关键字,作用是什么 volatile是java虚拟机提供的轻量级同步机制 ​ 作用是: 1.保证可见性 2.禁止指令重排 3.不保证原子性 本篇具体就讲解 什么叫保证了可见性, 什么叫禁止指令重排,什么是原子性 而在这之前需要对JMM 有所了解 二,什么是JMM ​ JMM(java 内存模型 Java Memory Model 简称JMM) 本身是一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量(实例字段,静态字段和

  • Java中token的存储和获取实例代码

    目录 1. 获取token的工具类 2. header存储token 2.1 前端存储token 2.2 访问携带token 2.3 后端获取token并进行验证(拦截器中进行验证) 3. URL中的属性值 4. Cookie 4.1 控制器代码 4.2 测试 向Cookie中插入key - value值!!! 总结 1. 获取token的工具类 问:为什么写工具类呢???答:因为我们不知道前端将token怎么存储的,所以我们可以通过调用Token工具类来获取token.Token工具类会检查h

  • Java框架学习Struts2复选框实例代码

    复选框在Web开发中使用的非常多,现在我们通过struts2的复选框标签来实现一些在开发中经常遇到的问题. 先来看看这个标签的属性: 注:listKey相当于HTML中的value属性,这个值在和后台交互时才真正是我们在后台要使用的:listValue只是内容的显示而已. 案例1 用户选择了喜欢的课程,现在要对已经选择的课程进行修改,跳转到修改界面,然后回显已经勾选的课程. 用户已选课程界面: 点击按钮后进入课程修改界面: 注:在修改界面要对用户最初的选择进行回显. 代码实现!!!! 用户已选课

  • Java中JDBC实现动态查询的实例详解

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语句的构成 一旦用户向查询条件中输入数据,该查询条件就成为最终条件的一部分. 二 基本原理 1.SQL基本框架 无论查询条件如何,查询字段与数据库是固定不变的,这些固定不变的内容构成SQL语句的基本框架,如 select column... from table. 2.StringBuilder形成D

  • Java中过滤器 (Filter) 和 拦截器 (Interceptor)的使用

    1.过滤器 (Filter) 过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法. init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次.注意:这个方法必须执行成功,否则过滤器会不起作用. doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter. destroy(): 当容器销毁 过滤器

  • java 中Excel转shape file的实例详解

    java  中Excel转shape file的实例详解 概述: 本文讲述如何结合geotools和POI实现Excel到shp的转换,再结合前文shp到geojson数据的转换,即可实现用户上传excel数据并在web端的展示功能. 截图: 原始Excel文件 运行耗时 运行结果 代码: package com.lzugis.geotools; import com.lzugis.CommonMethod; import com.vividsolutions.jts.geom.Coordina

  • java 将byte中的有效长度转换为String的实例代码

    一般的我们使用byte接收读取到的数据,若数据没有达到byte定义的大小时,我们直接将byte转换为String则会出现乱码的情况,在这种情况下应该基于read的返回值来转换byte,否则将产生乱码的情况, 下面是一个简单的示例: package com.javaio.myinputstream; public class MyConsole { public static void main(String argv[]) throws Exception { System.out.printl

  • JAVA 中解密RSA算法JS加密实例详解

    JAVA 中解密RSA算法JS加密实例详解 有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.Java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.

随机推荐