在Struts2中,有内置的拦截器,在struts-core的struts-default.xml中,有一些框架自身默认配置的拦截器。
在拦截器中,有一个拦截器栈,在拦截器栈中拦截器的顺序非常的重要。action会按照里面的顺序去通过拦截器。
、只要在定义包的过程中继承struts-default包,defaultstack就是默认的拦截器栈
、当为一个显式的拦截器定义一个拦截器时,则不再调用他的默认拦截器
、拦截器栈中的顺序很重要,需要符合逻辑性
在这里我们模拟一个用户权限的登入拦截器,需要登入的用户才可以登入,不然无法登入页面。
login.jsp
<body>
<h2>用户登入</h2>
${loginerro}
<form action="login" method="post">
用户名:<input type="text" name="user" />
密码:<input type="password" name="password"/>
<input type="submit" value="登入"/>
</form>
</body>
manager.jsp
<body>
此页面只有登入用户的人可以查看,其他不可以。
</body>
需要一个处理登入请求的类
login.jsp
public class Login extends ActionSupport implements SessionAware{
private String user;
private String password;
private Map<String, Object> session;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
//处理登入请求
public String login(){
if("admin".equals(user)&&"123".equals(password)){
session.put("logininfo", user);
return SUCCESS;
}else{
session.put("loginerro", "用户名不正确");
return ERROR;
}
}
}
使用session来保存是否登入的信息
一个继承abstractinterceptor的类
LoginInterceptor.jsp
public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext context=ActionContext.getContext();
//得到session中的是否登入信息
Map<String, Object> session=context.getSession();if(session.get("logininfo")!=null){String result=invocation.invoke();return result;}else{return "login";}}} 创建完毕以后我们在xml文件中进行配置拦截器和action运行结果如下:<!--注册拦截器 --> <interceptors> <interceptor name="auth" class="com.imooc.interceptor.LoginInterceptor"></interceptor> <!-- 自定义拦截器组合 --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="auth"></interceptor-ref> </interceptor-stack> </interceptors><!--通过此action来访问后台页面,需要判断用户是否登入,如果没有登入就跳转到登入页面 --> <action name="auth"> <result>/WEB-INF/page/manager.jsp</result> <result name="login">/WEB-INF/page/login.jsp</result> <!--引用拦截器栈 --> <interceptor-ref name="mystack"></interceptor-ref> </action> <action name="login" class="com.imooc.action.Login" method="login"> <result>/WEB-INF/page/manager.jsp</result> <result name="error">/WEB-INF/page/login.jsp</result> </action>