Filter与Interceptor和Spring AOP地和的的区别与用法

1319人阅读
Spring(23)
1.Filter过滤器只过滤jsp文件不过滤action请求解决方案
解决办法:在web.xml中将filter的配置放在struts2配置的前面。
2.拦截器与Filter的区别&
Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。
深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。
实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。&
filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。&&
JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。&
所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。&
当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。&
3.servlet、filter、interceptor的执行顺序
&&& Filter代码:
Java代码&&
@Override&&
&&&&public&void&doFilter(ServletRequest&servletrequest,&&
&&&&&&&&&&&&ServletResponse&servletresponse,&FilterChain&filterchain)&&
&&&&&&&&&&&&throws&IOException,&ServletException&{&&
&&&&&&&&System.out.println(&in&&filter&1.&);&&
&&&&&&&&filterchain.doFilter(servletrequest,&servletresponse);&&
&&&&&&&&System.out.println(&outing&filter&1&);&&
& &interceptor代码:
& & @Override
Java代码&&
public&String&intercept(ActionInvocation&actioninvocation)&throws&Exception&{&&
&&&&System.out.println(&in&logininterceptor&);&&
&&&&String&result=actioninvocation.invoke();&&
&&&&System.out.println(&outing&logininterceptor&);&&
&&&&return&&&
& & action代码:
Java代码&&
@Override&&&&
&&&public&String&execute()&throws&Exception&{&&&&
&&&&&&&System.out.println(&in&loginaciton&);&&
&&&&&&&ActionContext&context=ActionContext.getContext();&&
&&&&&&&Map&String,&Object&&session=context.getSession();&&&
&&&&&&&session.put(&userName&,&userName);&&&&
&&&&&&&System.out.println(&outing&loginaciton&);&&
&&&&&&&return&SUCCESS;&&&&
&& jsp代码:
Html代码&&
&&type=&text/javascript&&&&&&
Html代码&&
function&submitForm(){&&
&&&&&&document.getElementById(&form1&).submit();&&&
&&&This&is&Login&page.&&&
&&&&action=&&%=path&%&/login2.action&&method=&post&&id=&form1&&name=&form1&&&
&&&&&&UserName:&type=&text&&id=&userName&&name=&userName&&type=&button&&value=&submit&&onclick=&submitForm()&&id=&submit1&&&&
&& struts.xml
&name=&default&&extends=&struts-default&&namespace=&/&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&name=&MyInterceptor&&class=&Login.LoginInterceptor&&&
&&&&&&&&&&&&&&&&&name=&myInterceptorStack&&&
&&&&&&&&&&&&&&&&&&&&&name=&MyInterceptor&&&
&&&&&&&&&&&&&&&&&&&&&name=&defaultStack&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&name=&login2&&class=&Login.LoginAction&&&&&
&&&&&&&&&&&&&&&&&name=&success&&&&&
&&&&&&&&&&&&&&&&&&&/Login/success.jsp&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&name=&myInterceptorStack&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&
in& filter 1.
in logininterceptor
in loginaciton
outing loginaciton
outing logininterceptor
outing filter 1
3.servlet、filter的执行顺序
servlet代码:
Java代码&&
public&void&init()&throws&ServletException&{&&&
&&&&System.out.println(&servlet初始化&);&&
Java代码&&
public&void&doPost(HttpServletRequest&request,&HttpServletResponse&response)&&&&&&&&&&
Java代码&&
throws&ServletException,&IOException&{&&&
&&&&&&System.out.println(&in&servlet&);&&
&&&&response.setContentType(&text/html&);&&&
&&&&PrintWriter&out&=&response.getWriter();&&&
&&&&out&&&
&&&&&&&&.println(&&!DOCTYPE&HTML&PUBLIC&\&-//W3C//DTD&HTML&4.01&Transitional//EN\&&&);&&&
&&&&out.println(&&HTML&&);&&&
&&&&out.println(&&&&&&HEAD&&TITLE&A&Servlet&/TITLE&&/HEAD&&);&&&
&&&&out.println(&&&&&&BODY&&);&&&
&&&&out.print(&&&&&&&&&This&is&&);&&&
&&&&out.print(this.getClass());&&&
&&&&out.println(&,&using&the&POST&method&);&&&&&&&&
&&&&out.println(&&br&&);&&&
&&&&String&x&=&request.getParameter(&x&);&&&
&&&&String&y&=&request.getParameter(&y&);&&&
&&&&out.println(&x=&+x);&&&
&&&&out.println(&&br&&);&&&
&&&&out.println(&y=&+y);&&&
&&&&out.println(&&br&&);&&&
&&&&out.println(&&&&&&/BODY&&);&&&
&&&&out.println(&&/HTML&&);&&&
&&&&out.flush();&&&
&&&&out.close();&&&
&&&&System.out.println(&outing&servlet&);&&
Java代码&&
public&void&destroy(){&&&&&&&&
Java代码&&
System.out.println(&servlet销毁&);&&
&&&&&&&&super.destroy();&&
servlet初始化
in &filter 1.
in servlet
before HttpServletRequest
after HttpServletRequest
outing servlet
outing filter 1
当tomcat容器停止的时候,输出:servlet销毁
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:266681次
积分:3715
积分:3715
排名:第7903名
原创:58篇
转载:317篇
评论:15条
(2)(3)(1)(11)(35)(51)(3)(8)(6)(23)(17)(65)(22)(52)(14)(24)(6)(21)(2)(2)(1)(2)Filter、interceptor、aop
①它是面向对象思维方式的有力补充
②应用:
Filter:在处理jsp页面传输中文的解决过程中,我们可以引人一个filter,让所有的request和response都通过filter过滤。
Struts的interceptor:它的实现就体现了aop思想。正常情况下,直接就执行action,而加入拦截器后,可以在action前后都加上一些逻辑,同时也不破坏原来的ation的执行。当不需要这些功能时,就可以把拦截器撤了。
AOP需要解决的问题是:在一个类的某个方法前面加上新的业务逻辑。有如下方法:
①在原来类的方法上添加新的业务逻辑。
②继承。重写对应的方法。耦合性太强
③组合。实现接口,耦合性降低
④动态代理。
中AOP的配置与应用:权限检查,日志,审查,效率检测,事务,异常管理。Spring的AOP的实现,使用的是jdk的动态代理,同时spring还可以修改二进制码直接实现。
AOP的模拟实现(在service的add方法上加上日志,这儿用到了jdk的InvocationHandler和proxy)
//实现InvocationHandler接口
LogInterceptor.java
com.xie.spring.
java.lang.reflect.InvocationH
java.lang.reflect.M
com.xie.spring.dao.UserDAO;
public class
LogInterceptor implements InvocationHandler{
public Object getTarget() {
public void setTarget(Object target) {
this.target =
public void beforMethod(Method m){
System.out.println(m.getName()+" started");
public void afterMethod(Method m){
System.out.println(m.getName()+" success");
public Object invoke(Object proxy, Method method, Object[]
&&&&&&&&&&
throws Throwable {
beforMethod(method);
method.invoke(target, args);
afterMethod(method);
//测试方法:
public void testProxy(){
UserDAO userDao=new UserDAOImpl();
LogInterceptor log=new LogInterceptor();
log.setTarget(userDao);
UserDAO userDaoProxy=(UserDAO)
Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
new Class[]{UserDAO.class},
System.out.println(userDaoProxy.getClass());
userDaoProxy.save(new User());
userDaoProxy.delete(new User());
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。不懂数据库和Web安全的架构师不是一个好的程序员。1045人阅读
笔试题/面试题(286)
Spring/Struts2/Struts/Servlet(79)
Java基础/数据结构和算法分析(144)
1.Filter过滤器只过滤jsp文件不过滤action请求解决方案
解决办法:在web.xml中将filter的配置放在struts2配置的前面。
2.拦截器与Filter的区别&
Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。
深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。
实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。&
filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。&&
JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序来执行的。&
所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。&
当Filter被调用,并且进入了Struts2的DispatcherFilter中后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。&
3.servlet、filter、interceptor的执行顺序
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
System.out.println(&in
filter 1.&);
filterchain.doFilter(servletrequest, servletresponse);
System.out.println(&outing filter 1&);
& &interceptor代码:
public String intercept(ActionInvocation actioninvocation) throws Exception {
System.out.println(&in logininterceptor&);
String result=actioninvocation.invoke();
System.out.println(&outing logininterceptor&);
& & action代码:
public String execute() throws Exception {
System.out.println(&in loginaciton&);
ActionContext context=ActionContext.getContext();
Map&String, Object& session=context.getSession();
session.put(&userName&, userName);
/* HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.putValue(&userName&, userName);*/
System.out.println(&outing loginaciton&);
return SUCCESS;
&& jsp代码:
&script type=&text/javascript&&
function submitForm(){
document.getElementById(&form1&).submit();
This is Login page. &br&
&form action=&&%=path %&/login2.action& method=&post& id=&form1& name=&form1&&
UserName:&input type=&text& id=&userName& name=&userName&/&&input type=&button& value=&submit& onclick=&submitForm()& id=&submit1& /&
&& struts.xml
&package name=&default& extends=&struts-default& namespace=&/&&
&interceptors&
&interceptor name=&MyInterceptor& class=&Login.LoginInterceptor&&&/interceptor&
&interceptor-stack name=&myInterceptorStack&&
&interceptor-ref name=&MyInterceptor&/&
&interceptor-ref name=&defaultStack&/&
&/interceptor-stack&
&/interceptors&
&action name=&login2& class=&Login.LoginAction&&
&result name=&success&&
/Login/success.jsp
&interceptor-ref name=&myInterceptorStack&&&/interceptor-ref&
&/package&
in logininterceptor
in loginaciton
outing loginaciton
outing logininterceptor
outing filter 1
3.servlet、filter的执行顺序
servlet代码:
public void init() throws ServletException {
System.out.println(&servlet初始化&);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(&in servlet&);
response.setContentType(&text/html&);
PrintWriter out = response.getWriter();
out.println(&&!DOCTYPE HTML PUBLIC \&-//W3C//DTD HTML 4.01 Transitional//EN\&&&);
out.println(&&HTML&&);
out.println(&
&HEAD&&TITLE&A Servlet&/TITLE&&/HEAD&&);
out.println(&
out.print(&
This is &);
out.print(this.getClass());
out.println(&, using the POST method&);
out.println(&&br&&);
String x = request.getParameter(&x&);
String y = request.getParameter(&y&);
out.println(&x=&+x);
out.println(&&br&&);
out.println(&y=&+y);
out.println(&&br&&);
out.println(&
&/BODY&&);
out.println(&&/HTML&&);
out.flush();
out.close();
System.out.println(&outing servlet&);
public void destroy(){
System.out.println(&servlet销毁&);
super.destroy();
servlet初始化
in servlet
before HttpServletRequest
after HttpServletRequest
outing servlet
outing filter 1
当tomcat容器停止的时候,输出:servlet销毁
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:320662次
积分:7302
积分:7302
排名:第2700名
原创:227篇
转载:713篇
译文:83篇
评论:27条

我要回帖

更多关于 地和的的区别与用法 的文章

 

随机推荐