最近换了家新公司,主要负责前后台交互这块,用的ssh框架,所以我接触的是struts和前端较多,现在总结一下配置拦截器的一些知识,巩固一下。
struts2拦截器可以拦截一些请求,比如用户没登陆就想访问某个页面,比如用户没有某个页面的访问权限,却发送访问请求,这些都是要被拦截下来的,基于这些需求,我研究了一下struts2的拦截器。
要使用拦截器,首先需要在struts.xml中配置,配置文件如下:
<struts> <package name="publicInterceptor" extends="global"> <interceptors> <!-- 登录拦截器 --> <interceptor name="logon" class="com.arche.alderman.Interceptor.LoginInterceptor"/> <!-- 登录拦截器堆栈 --> <interceptor-stack name="publicLoginStack"> <interceptor-ref name="logon"/> <!-- 引用默认的拦截器堆栈 --> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <global-results> <result name="result_json">/WEB-INF/index/index.jsp</result> </global-results> <action name="public_oper_userLogin" class="com.arche.alderman.mvc.pub.controller.implement.PublicOperAction" method="userLogin"> <interceptor-ref name="publicLoginStack" /> <result name="result_json" type="json"> <param name="root">mResult</param> </result> <result name="input">/WEB-INF/index/index.jsp</result> <result name="association"></result> <result name="engineer"></result> <result name="enterprise"></result> </action> <action name="public_check_*" class="com.arche.alderman.mvc.pub.controller.implement.PublicCheckAction" method="{1}"> <result name="result_json" type="json"> <param name="root">mResult</param> </result> </action> </package> </struts>
值得注意的是,定义的拦截器栈名和interceptor-stack的name必须保持一致。
注意:
<default-interceptor-ref name="publicLoginStack"/>
这段代码的作用是在整个package中的所有action,不管有没有写调用拦截器的这段代码:
<interceptor-ref name="publicLoginStack" />
都会默认调用拦截器,所以当有多个action时,需要手动添加上面这句代码,并且删除掉
<default-interceptor-ref name="publicLoginStack"/>
。
配置好了后,我们需要写一个interceptor类,来处理用户访问的请求(允许访问还是不允许等),这个类即上面<interceptor>的 class属性中的LoginInterceptor.java:
com.arche.alderman.Interceptor; com.arche.alderman.constant.RequestInteractionString; com.arche.alderman.constant.ServerCommonString; com.arche.alderman.mvc.pub.vo.UserLoginInfo; com.opensymphony.xwork2.ActionInvocation; ; java.util.Map; LoginInterceptor { String intercept(ActionInvocation actionInvocation) Exception { String name = actionInvocation.getInvocationContext().getName(); (name.equals()) { actionInvocation.invoke(); } { Map session = actionInvocation.getInvocationContext().getSession(); (== session || session.isEmpty()) { ServerCommonString.; } { UserLoginInfo userLoginInfo = (UserLoginInfo) session.get(RequestInteractionString.); (== userLoginInfo){ ServerCommonString.; }{ (!= userLoginInfo.getUserId() || != userLoginInfo.getUserName() || != userLoginInfo.getUserType()) { actionInvocation.invoke(); } { ServerCommonString.; } } } } } }
需要特别注意的是,这个类要继承AbstractInterceptor类,然后重写interceptor()方法。
大概就是这些,挺简单的!