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