了解java Struts拦截器的相关操作
实现aop的方式
用于实现action之前
- 一般用于事物操作.
- 一般用于对某些未授权的页面访问的时候,进行拦截操作,拦截非法访问.
开箱即用拦截器
必须有传递属性这个拦截器
运行输出日志如下
2019-03-2403:50:19.231[DEBUG]com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67)-Checkingaccessfor[target:com.ming.HelloWorldAction@33e67d25,member:publicjava.lang.Stringcom.ming.HelloWorldAction.getName(),property:name] 2019-03-2403:50:19.232[INFO]com.opensymphony.xwork2.interceptor.TimerInterceptor.doLog(TimerInterceptor.java:205)-Executedaction[//hello!execute]took12ms.
可以看到这个action一共运行耗时12ms
自定义拦截器
需要继承该抽象类,并实现其方法即com.opensymphony.xwork2.interceptor.AbstractInterceptor抽象类
代码如下
packagecom.ming; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.AbstractInterceptor; publicclassMyInterceptorextendsAbstractInterceptor{ /** *Overridetohandleinterception * *@paraminvocation */ @Override publicStringintercept(ActionInvocationinvocation)throwsException{ returnnull; } }
实现该类的interceptor方法
packagecom.ming; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.AbstractInterceptor; importorg.apache.logging.log4j.LogManager; importorg.apache.logging.log4j.Logger; publicclassMyInterceptorextendsAbstractInterceptor{ /** *Overridetohandleinterception * *@paraminvocation */ @Override publicStringintercept(ActionInvocationinvocation)throwsException{ Loggerlogger=LogManager.getLogger(); //执行结果前 Stringoutput="hibefore"; logger.info(output); //开始执行Action Stringresult=invocation.invoke(); //执行结果后 output="hiafter"; logger.info(output); //继续传递到下一个拦截器 returnresult; } }
更改配置文件
/HelloWorld.jsp /error.html
控制台输出结果如下
2019-03-2404:37:24.086[DEBUG]com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67)-Checkingaccessfor[target:com.ming.HelloWorldAction@5121691d,member:publicvoidcom.ming.HelloWorldAction.setName(java.lang.String),property:name] 2019-03-2404:37:24.087[INFO]com.ming.MyInterceptor.intercept(MyInterceptor.java:19)-hibefore 2019-03-2404:37:24.089[DEBUG]com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:430)-Executingactionmethod=execute 2019-03-2404:37:24.106[DEBUG]com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67)-Checkingaccessfor[target:com.ming.HelloWorldAction@5121691d,member:publicjava.lang.Stringcom.ming.HelloWorldAction.execute()throwsjava.lang.Exception,property:null] 2019-03-2404:37:24.143[DEBUG]com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67)-Checkingaccessfor[target:org.apache.struts2.result.ServletDispatcherResult@2e4369c6,member:publicvoidorg.apache.struts2.result.StrutsResultSupport.setLocation(java.lang.String),property:location] 2019-03-2404:37:24.143[DEBUG]com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67)-Checkingaccessfor[target:org.apache.struts2.result.ServletDispatcherResult@2e4369c6,member:publicvoidorg.apache.struts2.result.StrutsResultSupport.setLocation(java.lang.String),property:location] 2019-03-2404:37:24.150[DEBUG]org.apache.struts2.result.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:127)-Forwardingtolocation:/error.html 2019-03-2404:37:24.158[DEBUG]com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.nullPropertyValue(InstantiatingNullHandler.java:98)-EnteringnullPropertyValue[target=[com.ming.HelloWorldAction@5121691d,com.opensymphony.xwork2.DefaultTextProvider@2e34626e],property=struts] 2019-03-2404:37:24.175[INFO]com.ming.MyInterceptor.intercept(MyInterceptor.java:26)-hiafter 2019-03-2404:37:24.176[INFO]com.opensymphony.xwork2.interceptor.TimerInterceptor.doLog(TimerInterceptor.java:205)-Executedaction[//hello!execute]took89ms.
可以看到,由于配置了3个拦截器,拦截器被顺序执行。
在执行前后分别执行了两个操作,这就是面向切面编程。
此处可以添加事物锁,其中锁可以用redis实现,达到同时多个tomcat实例读取数据库的时候,进行加锁操作,使用redis达到锁的目的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。