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

6
回复
481
查看
[复制链接]

359

主题

359

帖子

828

安币

手工艺人

发表于 2018-5-21 11:17:35 | 显示全部楼层 |阅读模式

            

        本文实例为大家分享了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:

[Java] 查看源文件 复制代码
<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:

[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:

[Java] 查看源文件 复制代码
<%@ 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:

[Java] 查看源文件 复制代码
<!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:

[Java] 查看源文件 复制代码
<%@ 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>,则会看到源码:

[Java] 查看源文件 复制代码
<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:

[Java] 查看源文件 复制代码
<pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><

        testaction.java:

[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:

[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






        

2

主题

9463

帖子

2478

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-21 15:06:48 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

8

主题

9326

帖子

3547

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-5-21 22:05:31 | 显示全部楼层
每次我都积极回帖的,想要安币~

3

主题

9474

帖子

1796

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2018-5-22 04:32:05 | 显示全部楼层
支持楼主,支持安卓巴士!

85

主题

9826

帖子

2201

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-22 11:01:55 | 显示全部楼层
感谢大神~

2

主题

9664

帖子

2092

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2018-5-22 17:15:21 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

0

主题

9863

帖子

1695

安币

Android大神

IT

Rank: 6Rank: 6

发表于 2018-5-22 21:50:24 | 显示全部楼层
感谢分享,楼主V5~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )