Struts拦截器的使用
来源:互联网 发布:bootstrap input控件js 编辑:程序博客网 时间:2024/05/22 00:21
拦截器(interceptor)
介绍拦截器:
struts2拦截器使用的是AOP思想。
AOP的底层实现就是动态代理。
拦截器 采用 责任链 模式
* 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
* 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
struts2中在struts-default.xml文件中声明了所有的拦截器。
而struts2框架默认使用的是defaultStack这个拦截器栈。
在这个拦截器栈中使用了18个拦截器。简单说,struts2框架
在默认情况下,加载了18个拦截器。
-----------------------------------------------------
1.struts2中怎样使用拦截器
问题:使用拦截器可以做什么?
可以通过使用拦截器进行控制action的访问。例如,权限操作。
怎样使用拦截器?
1.创建一个Interceptor 可以自定义一个类实现com.opensymphony.xwork2.interceptor.Interceptor
在这个接口中有三个方法 init destory intercept, intercept方法是真正拦截的方法。
在intercept方法中如果要向下继续执行,通过其参数ActionInvocation调用它的invoke()方法就可以。
2.声明一个Interceptor
在struts-default.xml文件中
<interceptors>
<interceptor name="" class=""/>
</interceptors>
注意:我们要自己声明一个interceptor可以在struts.xml文件中声明。
3.在action中指定使用哪些拦截器.
<interceptor-ref name="my"/>
注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。
-----------------------------------------------------------------------
2.分析拦截器原理
源代码执行流程:
1.在StrutsPrepareAndExecuteFilter中查找
在doFilter方法内有一句话 execute.executeAction (request, response, mapping) 执行Action操作.
2.在executeAction执行过程中会访问Dispatcher类中的serviceAction,在这个方法中会创建一个
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext, true, false);
这就是我们的Action的代理对象
3.查看ActionInvocation,查看其实现类 DefaultActionInvocation.
在其invoke方法中
if (interceptors.hasNext()) {//判断是否有下一个拦截器.
final InterceptorMapping interceptor = interceptors.next(); //得到一个拦截器
String interceptorMsg = "interceptor: " + interceptor.getName();
UtilTimerStack.push(interceptorMsg);
try {
resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
//调用得到的拦截器的拦截方法.将本类对象传递到了拦截器中。
}
finally {
UtilTimerStack.pop(interceptorMsg);
}
}
通过源代码分析,发现在DefaultActionInvocation中就是通过递归完成所有的拦截调用操作.
关于interceptor与Filter区别:
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
怎样解决只控制action中某些方法的拦截?
1.创建类不在实现Interceptor接口,而是继承其下的一个子类.MethodFilterInterceptor
不用在重写intercept方法,而是重写doIntercept方法。
2.在struts.xml文件中声明
<interceptors>
<intercept name="" class="">
<param name="includeMethods">add,update,delete</param>
<param name="excludeMethods">search</param>
</intercept>
</interceptors>
-----------------------------------------------------------------------
3.案例
权限控制:
1.login.jsp------>LoginAction------------->book.jsp
登录成功,将用户存储到session。
2.在book.jsp中提供crud链接。
每一个连接访问一个BookAction中一个方法。
要求:对于BookAction中的add,update,delete方法要求用户必须登录后才可以访问。search无要求。
Action:
LoginAction:
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return user;
}
public String login(){
if("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())){
//把用户信息放到会话中
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return SUCCESS;
}else{
//校验错误则报错到登陆页面
this.addActionError("用户名或密码不正确");
return LOGIN;
}
}
}
BookAction:
public class BookAction extends ActionSupport{
public String add(){
System.out.println("add....");
return null;
}
public String update(){
System.out.println("update....");
return null;
}
public String delete(){
System.out.println("delete....");
return null;
}
public String search(){
System.out.println("search....");
return null;
}
}
Interceptor:
BookInterceptor:
public class BookInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation ai) throws Exception {
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
if(user == null) {
BookAction action = (BookAction) ai.getAction();
action.addActionError("权限不足,请先登录");
//调到login对应的视图
return Action.LOGIN;
}
//放行
return ai.invoke();
}
}
Struts.xml:
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="bookInterceptor" class="com.demo.test5.interceptor.BookInterceptor">
<!-- 拦截器拦截的方法 -->
<param name="includeMethods">add,update,delete</param>
<!-- 不拦截的方法 -->
<param name="excludeMethods">search</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="bookInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 全局结果页面 -->
<global-results>
<result name="login">/test5/login.jsp</result>
</global-results>
<action name="login" class="com.demo.test5.action.LoginAction" method="login">
<result name="input">/test5/login.jsp</result>
<result>/test5/book.jsp</result>
</action>
<action name="book_*" class="com.demo.test5.action.BookAction" method="{1}">
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
阅读全文
0 0
- struts拦截器的使用
- Struts 拦截器的使用
- struts拦截器的使用
- Struts拦截器的使用
- struts拦截器使用
- Struts拦截器使用
- struts拦截器使用
- struts 拦截器 使用
- struts拦截器的的使用
- struts 登录拦截器的使用
- Struts 内置拦截器的使用 valuestack
- Struts 拦截器interceptor 的使用
- Struts中拦截器的使用
- struts拦截器的使用(简单例子)
- Struts 2读书笔记-----拦截器之拦截器的使用
- struts 的拦截器
- struts的拦截器
- 使用struts配置拦截器
- 在java中String a="a",b="a";a==b为什么返回true?
- ElasticSearch学习
- Java用户注册手机短信验证码校验功能实现
- 2017年快结束了 你的小目标定好了么?
- 第十周 项目4
- Struts拦截器的使用
- Hexo+GitHub Pages 加入文章跟帖功能
- STM32F469I-DISCO移植Linux4.13.12
- spring4 quartz 定时任务亲测
- Spring boot拦截器Interceptor引用外部properties配置(@Value)
- 《C++ Primer》读书笔记第十三章-2-拷贝控制、交换、动态内存管理类
- Springboot 使用 RestTemplate
- codeforce 877D 路径查找
- mac 修改myssql 密码重置