1.struts.xml
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="AuthInterceptor" class="interceptor.AuthInterceptor"/>
<interceptor-stack name="AuthStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="AuthInterceptor"/>
</interceptor-stack>
</interceptors>
<global-results>
<result name="error">/WEB-INF/inc/error.jsp</result>
<result name="loginInput">/WEB-INF/Login/input.jsp</result>
</global-results>
<action name="*_*_*" class="action.{2}Action" method="{3}">
<interceptor-ref name="AuthStack"/>
<result>/WEB-INF/{2}/{3}.jsp</result>
<result name="redirect" type="redirect">${url}</result>
</action>
</package>
如何配置拦截器?
(1):在interceptors中配置拦截器的完整类名
(2):创建拦截器栈,里面要包括defaultStack
(3):在action中调用拦截器栈
2.Interceptor类的编写
public class AuthInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO 自动生成的方法存根
String url=invocation.getProxy().getActionName();
String username=(String) ActionContext.getContext().getSession().get("username");
Boolean isAdmin=(Boolean) ActionContext.getContext().getSession().get("isAdmin");
if(url.startsWith("admin")) {
if(username==null||"".equals(username.trim())){
return "loginInput";
}
if(isAdmin==null||isAdmin==false){
return "error";
}
}
if(url.startsWith("user")){
if(username==null||"".equals(username.trim())){
return "loginInput";
}
}
return invocation.invoke();
}
}
如何编写?
(1):继承AbstractInterceptor类
(2):invocation.invoke意思是通知struts接着干下面的事情,比如执行下一个拦截器或者执行下一个action
(3):强制类型转换要用Boolean而不是boolean
3.LoginAction的编写
public class LoginAction {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String input() {
return "success";
}
public String login() {
if(username.equals("admin")) {
ActionContext.getContext().getSession().put("isAdmin", true);
}
ActionContext.getContext().getSession().put("username", username);
ActionContext.getContext().put("url", "/user_Article_add");
return "redirect";
}
public String logout() {
ActionContext.getContext().getSession().clear();
ActionContext.getContext().put("url", "/common_Login_input");
return "redirect";
}
}
注意:
(1):可以使用ActionContext.getContext.put(注意不是放到session中,是放到context中) 实现把url传到struts.xml中
(2):有多个重定向,可以return redirect,每次把url传过去,在xml中用${url}接收
<result name="redirect" type="redirect">${url}</result>
最后讲一下global-results,有时候一个result可供多个action使用,这个时候就可以用global-results来定义全局result
它的执行顺序是:当一个action返回的String没有相应的result与它对应,就会查找全局result