前端框架选型是企业提升开发效率与用户体验的关键因素
697
2022-10-31
J2EE中的过滤器和-
过滤器和-的相似之处就是拦截请求,做一些预处理或者后处理。
而过滤器和-的区别在于过滤器是相对HTTP请求而言的,而-是相对Action中的方法的。
过滤器:访问web服务器的时候,对一个请求,我们可以设置请求编码,设置请求参数,设置其是否能访问某个页面,设置相应编码等。
-:访问web服务器的时候,在你调用的方法前做一个拦截,加上我想要的任意操作。比喻记录操作日志,加上某个特定业务(AOP)。
1、过滤器
过滤器需要做两部分的工作:Filter过滤类、web.xml配置
Filter类部分:
web.xml部分:
2、-
Struts的-本质上还是通过过滤器来实现的。
-实现需要做两部分的工作:Interceptor过滤类、struts.xml配置
-类:
package com.chanshuyi.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings("serial")public class MyInterceptor extends AbstractInterceptor { private String name; public void setName(String name) { this.name = name; } @Override public String intercept(ActionInvocation invocation) throws Exception { //get the target action //LoginAction action = (LoginAction)invocation.getAction(); System.out.println(name + "Interceptor begin to work ..."); long startMill = System.currentTimeMillis(); //execute the target action method String result = invocation.invoke(); long endMill = System.currentTimeMillis(); System.out.println(name + "Interceptor ends, time cost:" + (endMill - startMill)); System.out.println("result is : " + result); return result; }}
你可以通过实现Interceptor接口来实现-。但是Java为我们提供了AbstractInterceptor类,通过实现AbstractInterceptor类可以让我们减少编码(因为AbstractInterceptor已经帮我们实现了init()/destory()方法,我们只需再实现interceptor方法即可)
struts.xml配置部分:
MARK CHENYR (这里需要补充)
3、只拦截部分Action部分方法的-
通过继承AbstractInterceptor的子类:MethodFilterInterceptor类,可以实现对Action中方法级的过滤。
它与继承AbstractInterceptor实现过滤在代码上的不同在于:
1).需要继承的是MethodFilterInterceptor类
2).需要实现的是doInterceptor方法,而不是interceptor方法
3).可以通过setExcludeMethod/setIncludeMethod方法或配置文件的方式实现方法的过滤
-部分代码(将intercept方法换成doIntercept即可):
@SuppressWarnings("serial")public class CopyOfMyInterceptor extends MethodFilterInterceptor { private String name; public void setName(String name) { this.name = name; } @Override public String doIntercept(ActionInvocation invocation) throws Exception { //get the target action //LoginAction action = (LoginAction)invocation.getAction(); System.out.println(name + "Interceptor begin to work ..."); long startMill = System.currentTimeMillis(); //直接调用setExcludeMethod/setIncludeMethod方法给excludeMethod/includeMethod属性赋值。这与用配置文件赋值是一样的 //execute the target action method String result = invocation.invoke(); long endMill = System.currentTimeMillis(); System.out.println(name + "Interceptor ends, time cost:" + (endMill - startMill)); System.out.println("result is : " + result); return result; }}
通过配置文件实现对方法的过滤:
4、关于过滤器和-的执行顺序
在一般情况下,过滤器和-都是先配置先执行的。
下面用过滤器的一个例子说明:
web.xml部分代码:
Filter1类的关键代码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { System.out.println("filter1"); chain.doFilter(request, response); System.out.println("filter1 go back"); } catch (Exception e) { e.printStackTrace(); }}
Filter2类与Filter1类一样,只是输出内容变成了“filter2”以及“filter2 go back”。
运行结果为:
filter1filter2filter2 go backfilter1 go back
可以看出,过滤器和-的执行顺序是先定义先执行,并且执行是类似于堆栈的先进后出的执行顺序。
5、关于过滤器和-的思考
在说-和过滤器之前,先说这两者的几点区别:
1.过滤器可以对所有HTTP请求进行拦截,但-只能对Action请求进行拦截
2.过滤器是Servlet中的概念,-是Struts中的概念
在Struts还没有出来的时候,-这个概念是不存在的。在Struts出来之后,-也来了。-是通过Servlet来实现的,-对过滤器进行了一层封装,使Struts框架更加好用。
在使用了Struts框架的项目中,更多人直接使用-,过滤器的概念就被弱化了。这是我的一些理解。因此在使用了Struts的项目中,你可以直接使用-对所有Action请求进行拦截,对他们进行权限控制。
但-不能拦截直接访问的页面,那这些页面如何保障权限的控制呢?答案是将页面房在WEB-INF目录下(WEB-INF目录下的文件不能通过客户端直接访问),只将少数必要的文件放在Web-Root目录,这样就可以实现这些页面的安全。
总的来说,如果你的项目使用了Struts,那么你可以直接用Struts的-实现权限控制等。
但如果你的项目是用纯Servlet写的,那么你只能用过滤器实现了。
===================== 相信美好的事情终会发生 ====================
struts.xml文件中-配置集锦
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~