(十二)Struts2进阶之拦截器
程序员文章站
2022-05-28 17:21:35
...
1.拦截器底层实现原理
(1)AOP思想
(2)责任链模式(一种设计模式)
2.实现拦截器的三种方式
(1)实现Interceptor接口,重写三个方法
(2)继承AbstractInterceptor类,重写intercept方法
(3)继承MethodFilterInterceptor类,重写doIntercept方法
注意:要让拦截器不拦截action中的某个方法,则该拦截器必须使用第三种实现方式,即继承MethodFilterInterceptor类
3.实现一个拦截器
我们自己实现一个拦截器,该拦截器的主要功能是检测用户是否登录,如果用户没有登录,访问某些页面,则跳转到登录页面。
首先是在action中将用户输入的账户密码存入session,然后在拦截器中取得账户密码,进行一个判断,如果登录了,则同意用户的请求,否则跳转到登录页面。
下面是action的代码,就贴关键的
public String login() {
// 获取session对象
ActionContext act = ActionContext.getContext();
Map<String, Object> map = act.getSession();
if("admin".equals(username) && "admin".equals(password)) {
// 登录成功则把信息存入session
map.put("username", username);
return SUCCESS;
} else {
map.put("loginError", "用户名或密码不正确");
return "error";
}
}
下面是拦截器的代码
@SuppressWarnings("serial")
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
public String doIntercept(ActionInvocation invocation) throws Exception {
// 获取session对象
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
// 判断用户是否已登录
if(session.get("username") != null) {
String result = invocation.invoke();
return result;
} else {
return "error";
}
}
}
我们使用的第三种方式实现拦截器,重写了doIntercept方法。
下面在struts.xml中进行配置
<struts>
<package namespace="/" extends="struts-default" name="default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.codeliu.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<action name="login" class="com.codeliu.action.LoginAction" method="login">
<!-- 为某个action显示指定拦截器后,默认的拦截器栈将不会生效,如果要使用,需要手工指定 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用拦截器 -->
<interceptor-ref name="loginInterceptor">
<!-- 配置使该拦截器不拦截这个方法,可配置多个方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<result>success.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>
可以看到我们先注册了一个拦截器,然后把拦截器应用在login这个action里面,默认是对action里的所有方法都起作用,但有时候,一个action的有些方法我们不需要被拦截器拦截,这时候得设置param 参数,name的属性值为excludeMethods,我们可以设置多个不被拦截的方法,但注意,拦截器必须使用第三种方式实现才能这样设置。
同时我们还手动进行了默认拦截器defaultStack的设置,当我们自己知道了拦截器的时候,默认的拦截器就不会起作用了,这时得自己设置,在核心jar包里能清楚的看到这些默认的拦截器,就不多说了。
到这里Struts2的文章暂时先告一段落了。