实验二 拦截器
- 格式:pdf
- 大小:490.76 KB
- 文档页数:4
《软件开发框架(J2EE)》课程实训(验)项目单编制部门:编制人:审核人: 编制日期: 2015年9月 7日四、评分标准1.操作规范(20%)2.完成使用拦截器检测用户登录程序开发(50%)3.实训报告(30%)《软件开发框架(J2EE)》课程实训(验)项目单编制部门:编制人:审核人: 编制日期: 2015年9月 7日内容(方法、步骤、要求或考核标准)一、实训设备与工具1.PC机(内存512M以上)2.MyEclipse、JDK、Tomcat、Struts 2框架、浏览器二、实训项目描述当我们签收了在网上购买的商品后,可以对该商品的质量、性价比等进行评价。
为了尊重卖家,要求用户在评语中不能出现“人品差”字样。
如果出现该字样,则需要系统实现对文字的过滤,并使用“*”号来代替。
三、实训步骤、方法与要求1 在com.mxl.actions包中创建ContentAction类2 在com.mxl.interceptor包中创建ContentInterceptor类,该类为过滤文字的拦截器类3 在struts.xml文件中配置ContentInterceptor拦截器,并在ContentAction类的配置中使用该拦截器4 在struts.xml文件中配置自定义拦截器类LoginInterceptor,并在配置Action时引用该拦截器5 在WebRoot目录下新建content_send.jsp页面。
该页面用于用户发表评论6 在WebRoot目录下新建content_success.jsp页面,当评论成功后返回该页面7 运行结果1)将Web应用ch3部署到Tomcat服务器上,然后启动Tomcat服务器。
2)打开浏览器,在地址栏输入http://localhost:8080/ch3/content_send.jsp,显示发表评论界面。
3)输入评论人和评论正文信息,单击【立即发表评论】按钮,自定义过滤器对其发表的评论进行文字过滤,使用“*”号替换“人品差”。
Struts2拦截器登陆验证详细例子本文章适应对象:初学者,或者学struts2入门的人员引言:很实用的,运行过的,能运行成功的。
把相关的代码拷贝到工程目录下,相应的配置文件配置好,有解释的。
关键的代码如下:1、http://localhost:8083/struts2/user.jsp 表示用户已登陆,存放session对象2、http://localhost:8083/struts2/quit.jsp 表示用户已退出,移除session对象3、http://localhost:8083/struts2/login/addUIHelloWorld ...1、<http://localhost:8083/struts2/user.jsp> 表示用户已登陆,存放session对象2、<http://localhost:8083/struts2/quit.jsp> 表示用户已退出,移除session对象3、<http://localhost:8083/struts2/login/addUIHelloWorld.do> 如果session存在则往下执行,否则提示“你没有权限执行该操作”4、<http://localhost:8083/struts2/login/executeHelloWorld.do> 如果session存在则往下执行,否则提示“你没有权限执行该操作”代码user.jsp页面<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%request.getSession().setAttribute("user", "ljq");%>用户已经登录quit.jsp页面<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%request.getSession().removeAttribute("user");%>用户已经退出登录Action类package com.ljq.action;public class HelloWorldAction {private String message;public String addUI() {this.message = "addUI";return "success";}public String execute() throws Exception { this.message = "execute";return "success";}public String getMessage() {return message;}public void setMessage(String message) { this.message = message;}}权限类package com.ljq.interceptor;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;/*** 限制没有登录的用户进入访问页面** @author jiqinlin**/@SuppressWarnings("serial")public class PermissionInterceptor implements Interceptor {public void destroy() {}public void init() {}public String intercept(ActionInvocation invocation) throws Exception { Object user = ActionContext.getContext().getSession().get("user");// 如果user不为null,代表用户已经登录,允许执行action中的方法if (user != null){return invocation.invoke();}ActionContext.getContext().put("message", "你没有权限执行该操作");return "success";}}struts.xml配置文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.i18n.encoding" value="UTF-8" /><constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.action.extension" value="do" /><package name="login" namespace="/login" extends="struts-default"> <interceptors><!-- 自定义拦截器--><interceptor name="permission" class="com.ljq.interceptor.PermissionInterceptor" /><!-- 配制默许的拦截器到拦截器栈--><interceptor-stack name="permissionStack"><!-- 此处先后顺序好像没影响哦,我尝试过是没影响的--><interceptor-ref name="permission" /><interceptor-ref name="defaultStack" /></interceptor-stack></interceptors><!-- 配置默认的拦截器--><default-interceptor-ref name="permissionStack" /><!-- 全局变量--><global-results><result name="success">/WEB-INF/page/message.jsp</result> </global-results><action name="*HelloWorld" class="com.ljq.action.HelloWorldAction"method="{1}"><!-- <interceptor-ref name="permissionStack" /> --> </action></package></struts>。
Struts 2的基石——拦截器(Interceptor)/max/category/16130.html首先,要跟大家道个歉,前一阵子为给客户个一个DEMO,忙得不可开交,所以很久没有更新Blog。
提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发,一个类似Struts 2这样的简单方便的WEB框架必不可少。
我们在开发DEMO使用的还是Struts 1.2.8,而且没有不使用任何EL(表达式语言),导致页面出现无数类似“<%= ((Integer)request.getAttribute("xx")).intValue()%6 %>”的代码。
Struts 1.x的Form Bean的麻烦使得有部分同事直接使用request.getParameter(String arg),继而引入另一种麻烦。
诸如此类的问题,在DEMO这样时间紧迫的项目凸显了Struts 1.x对快速开发的无能为力。
不过没办法,由于我们项目中的几个资深员工除了Struts 1.x外,对其它的WEB框架似乎不大感兴趣。
言归正传,Interceptor(以下译为拦截器)是Struts 2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、转换器,校验等。
什么是拦截器拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截是AOP的一种实现策略。
在 Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。
拦截器内容提要拦截器(Interceptor)是动态拦截Action调用的对象,类似于Servlet中的过滤器。
在执行Action的execute()方法之前,Struts 2会首先执行在struts.xml中引用的拦截器。
所以说,拦截器提供了一种机制,使开发者可以在一个Action前后执行需要的代码,可以在一个Action执前阻止其执行,也可以在Action执行后做一些相应的工作,同时还提供一种可以提取Action中可重用部分的方式。
拦截器是Struts 2框架的基石,许多功能的实现都是构建在拦截器的基础之上的,例如文件的上传与下载、国际化、类型转换和数据校验等,并且Struts 2还提供内建拦截器,例如timer和params等,这些拦截器可完成框架的大部分任务。
学习目标理解拦截器的工作原理理解拦截器在Struts 2中的功能熟练掌握在Struts 2框架中配置拦截器的方法掌握拦截器的使用方法熟练掌握自定义拦截器的方法掌握拦截器中方法的过滤掌握内建拦截器1 拦截器简介拦截是AOP(Aspect-Oriented Programming,面向切面编程)的一种实现策略,如果说面向对象编程是将需求功能划分为不同的、相对独立的和封装良好的类,并使它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系,那么面向切面编程则是将通用需求功能从不相关的类中分离出来,使得很多类共享一个行为,一旦发生变化,不必修改很多类,只需修改这个行为即可。
Struts 2拦截器体系正是应用了AOP设计哲学,可以动态拦截Action调用的对象,开发者只需要提供拦截器的实现类,并将其配嚣在struts.xml文件中即可。
1.1 拦截器工作原理在通常情况下,拦截器都是通过代理的方式调用的。
当请求到达Struts 2的ServletDispatcher(Web HTTP请求的调度器,所有对Action的请求都将通过ServletDispatcher调用)时,Struts 2会查找配置文件,并根据配置实例化相对的拦截器对象,然后将这些对象串成一个列表(1ist),最后逐个调用列表中的拦截器,如图1-1所示。
Struts2 拦截器1.Struts中拦截器就是一个类,实现了Interceptor 接口的一个类。
2.Struts中拦截器和Servlet中的Filter有类似的功能,从字面意思来看,Struts 拦截器就是在目标对应执行之前或之后做一些事情,其实Struts中的拦截器的实现也是一样,在具体Action的被调用之前或之后可以做一些操作,采用配置化的方法进行管理,使用起来比较简单。
但是我们在学习过程中最好去了解拦截底层实现原理,以便在使用过程中能够控制自己的程序。
从了解拦截器的实现原理入手会是我们学习拦截器的最好途径。
3.拦截器采用的动态代理模式实现的在目标执行之前或之后插入必要的辅助业务。
其实采用的是一种AOP的思想,来降低系统耦合。
下面我们介绍一个动态代理:Java中提供一种动态代理的实现模式,我们用一个例子实现动态代理的演示:涉及到代理就肯定要有:目标对象代理对象拦截器三者之间的关系:代理对象代理目标对象在目标对象执行之前或之后加入拦截器的功能首先我们创建一个目标对象:3.1 定义一个接口?1 2 3 4 5package com.snt.struts2.interceptor;public interface ITargetInterface {public void doSomething();}3.2 定义一个目标对象实现目标对象接口[目标对象一定要实现一个接口]?1 2 3 4 5 6 7package com.snt.struts2.interceptor;public class Target implements ITargetInterface { // 拦截的目标对象public void doSomething() {System.out.println("do something...");}}893.3 定义一个拦截器(这里我们的拦截器比较简单,就是一个普通在类,定义了一在目标对象调用之前工之后要执行的操作)[定义的两个方法,代表在目标对象调用之前和之后要执行的操作]?12 3 4 5 6 7 8 9 10 11 12package com.snt.struts2.interceptor;public class Interceptor {public void befor() {System.out.println("before");}public void after() {System.out.println("after");}}3.4 下面来实现代理,如何为目标对象产生一个代理对象呢?java为我们提供了一定代理机制!Java在ng.reflect包下面提供了一个Proxy 类,这个类可以为一个目标类产生代理类。
STRUTS框架基础(实验二拦截器)1.内容回顾1)struts2工作原理2)struts2拦截器的工作方式3)struts2自定义拦截器的开发和配置2.实验目的1) 理解struts2的工作原理2) 理解struts2拦截器的工作方式3) 掌握Struts2自定义拦截器的开发和配置3.实验任务1) 查看struts2的默认配置文件中有关拦截器的设置2) 配置一个timer拦截器3) 设计一个简单的拦截器4) 简单的权限检查拦截器的开发4. 实验指导4.1 查看Struts2的默认配置文件中有关拦截器的配置部分1)打开struts-default.xml文件查看<package>中<interceptors>有关常见拦截器4.2 配置一个内置timer拦截器到应用中1)功能要求:获取执行某个Action组件所耗费的时间,以便做一个粗略的性能测试.2)由于timer拦截器是框架内置的,所以只需要对某个Action组件的配置中添加<interceptor-ref>即可,比对上讲HelloWorldAction进行耗时记录。
参考配置如下:3)部署应用并启动服务器,请求该Action组件。
4)观察服务器控制台输出:(以下为参考结果,不同机器不一样)分析:为什么两次请求不一样?4.3 设计一个自定义拦截器1) 功能要求:能够拦截struts请求,并打印一些提示信息。
2) 采用集成抽象类AbstractInterceptor的方式设计,参考代码如下:4)配置自定义拦截器:(1)首先使用在<interceptors>中,使用<interceptor>定义该拦截器,其中name属性为拦截器的别名,class属性指定该拦截器的实现类。
部分配置如下:(2)对某个Action组件配置该拦截器,配置参考上节timer拦截器的配置,参考如下:5)部署运行,察看控制台输出,参考结果如下:5. 权限坚持拦截器应用5.1 功能要求:如果请求到某个资源,但该资源需要等录用户才可访问,如果不是登陆用户则转到登录页面要求登录。
Struts2拦截器(翻译自Struts2官方网站)许多的Struts2中的Action需要共享一些共用信息或者是模块,有些Action需要对输入进行验证,另外一些Action 或许需要对文件上传之前做一些逻辑处理,又或者一些Action需要对重复提交进行保护,还有一些Actiion需要在页面显示前,初始化下拉框或一些页面组件。
Struts2框架使用了Interceptor(拦截器)策略使共享这些关心的模块更简单的使用起来。
当需要使用到一些映射到Action的资源时,框架生成了Action对象,但在该Action 被执行前,执法该Action中的方法被另外一个对象拦截了,在Action执行时,可能再次被拦截,我们亲切地称此对象为拦截器。
理解拦截器拦截器能够在一个Action执行前后拦截它。
目前的很多框架的核心实现均是基于拦截器。
(本人说两句,OOP 因为拦截器而显得更为精彩,AOP必将成为下一个核心关注点)。
拦截器可以帮助实现很多公共的内容,其中有重复提交,类型转换,对象初始化,验证,文件上传,页面初始化等等。
由于每个拦截器都可以像热插拔的模块,你可以在你的Action中正确地去使用需要的拦截器。
拦截器可以配置在一个基类的action中,自定义的拦截器可以尽量少或者配合框架中的已有的拦截器。
所以套用句外国人的话说吧,在一个Action执行时,让我们为它再提升一些吧,给Action更大的舞台更强大的力量吧。
如上图所示,Struts2的Action被一个或者多个拦截器围绕,所有的用户请求都会被拦截器所拦截,最后交给Action处理,处理结果以逻辑视图的方式返回给用户,调用的流程由配置文件来实现。
在一些例子中,一个拦截器可以解决像重复提交以及验证失败这样的例子。
当然也可以改变一个Action在执行前的状态。
拦截器可以定义为一个指定执行顺序的链中,在某些情况下,拦截器的顺序非常的重要。
="struts-default">该元素的意思是定义了一个继承于struts-default包的包,那么该包中的所有action均可使用struts-default.xml中定义的拦截器以及拦截器链。
一、实验目的本次实验旨在通过模拟网络请求和响应过程,设计和实现一个简单的拦截器,以实现对网络请求和响应的拦截、修改和记录等功能。
通过本次实验,加深对拦截器原理的理解,提高网络编程和软件开发能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:IntelliJ IDEA4. 测试工具:Postman三、实验原理拦截器(Interceptor)是一种在请求处理过程中对请求和响应进行拦截、修改和记录的机制。
在Java中,拦截器通常用于Spring框架中,通过实现HandlerInterceptor接口来实现。
本次实验中,我们将使用Java语言实现一个简单的拦截器,实现对HTTP请求和响应的拦截和修改。
四、实验步骤1. 创建一个Java项目,并添加必要的依赖。
2. 创建一个拦截器类,实现HandlerInterceptor接口。
3. 在拦截器类中,重写preHandle方法和postHandle方法。
4. 在preHandle方法中,对请求进行拦截和修改。
5. 在postHandle方法中,对响应进行拦截和修改。
6. 在Web.xml中配置拦截器。
7. 使用Postman发送请求,验证拦截器的功能。
五、实验代码```javaimport ponent;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Componentpublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 拦截请求,进行修改request.setAttribute("拦截器1", "请求被拦截了");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 拦截响应,进行修改response.setHeader("拦截器2", "响应被拦截了");}}``````xml<!-- Web.xml配置拦截器 --><filter><filter-name>myInterceptor</filter-name><filter-class>com.example.interceptor.MyInterceptor</filter-class></filter><filter-mapping><filter-name>myInterceptor</filter-name><url-pattern>/test/</url-pattern></filter-mapping>```六、实验结果使用Postman发送请求到测试地址(http://localhost:8080/test/test),可以看到请求和响应都被拦截器拦截并进行了修改。
STRUTS框架基础(实验二拦截器)
1.内容回顾
1)struts2工作原理
2)struts2拦截器的工作方式
3)struts2自定义拦截器的开发和配置
2.实验目的
1) 理解struts2的工作原理
2) 理解struts2拦截器的工作方式
3) 掌握Struts2自定义拦截器的开发和配置
3.实验任务
1) 查看struts2的默认配置文件中有关拦截器的设置
2) 配置一个timer拦截器
3) 设计一个简单的拦截器
4) 简单的权限检查拦截器的开发
4. 实验指导
4.1 查看Struts2的默认配置文件中有关拦截器的配置部分
1)打开struts-default.xml文件查看<package>中<interceptors>有关常见拦截器
4.2 配置一个内置timer拦截器到应用中
1)功能要求:获取执行某个Action组件所耗费的时间,以便做一个粗略的性能测试.
2)由于timer拦截器是框架内置的,所以只需要对某个Action组件的
配置中添加<interceptor-ref>即可,比对上讲HelloWorldAction进行耗时记录。
参考配置如下:
3)部署应用并启动服务器,请求该Action组件。
4)观察服务器控制台输出:(以下为参考结果,不同机器不一样)
分析:为什么两次请求不一样?
4.3 设计一个自定义拦截器
1) 功能要求:能够拦截struts请求,并打印一些提示信息。
2) 采用集成抽象类AbstractInterceptor的方式设计,参考代码如下:
4)配置自定义拦截器:
(1)首先使用在<interceptors>中,使用<interceptor>定义该拦截器,其中name属性为拦截器的别名,class属性指定该拦截器的实现类。
部分配置如下:
(2)对某个Action组件配置该拦截器,配置参考上节timer拦截器的配置,参考如下:
5)部署运行,察看控制台输出,参考结果如下:
5. 权限坚持拦截器应用
5.1 功能要求:如果请求到某个资源,但该资源需要等录用户才可访问,如果不是登陆用户则转到登录页面要求登录。