今天由於軟件工程大項目的需要,我學習了下Struts2的自定義攔截器的使用方法。
其實很簡單,攔截器的思想就是在執行某個需要權限的action之前先進攔截器Action看一下是否符合要求,比如說是否有合法的session保存。
下面是各種配置文件:
1. 某package中的interceptors配置,這里沒用 interceptor-stack,因為只需要一層過濾。
<interceptors> <interceptor name="teacherInterceptor" class="com.postgraduate.interceptors.TeacherLoginInterceptor" > </interceptor> </interceptors> <global-results> <result name="login">/login.jsp</result> </global-results>
2.同一個package下的action配置,只是增加了一句
<action name="toTeacherIndex" class="com.postgraduate.action.TeacherAction" method="getIndex"> <result name="success">/teacher/teacher_index.jsp</result> <result name="error">/teacher/error.jsp</result> <interceptor-ref name="teacherInterceptor" /> </action>
3.同時還需要實現一個Interceptor類,用來處理驗證邏輯,其實就是個Action,只不過比普通的Action優先級高,而各Interceptor的優先級由stack決定。
public class TeacherLoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext ctx = invocation.getInvocationContext(); Map<String,Object> session = ctx.getSession(); Teacher teacher = (Teacher) session.get("teacher"); if(teacher == null) return "login"; else { return invocation.invoke(); } } }
4.登錄action(無權限執行)中設置session:
public String login() { int userId; try { userId = Integer.parseInt(user.getUserId()); } catch (Exception e) { return "login"; } if (type.equals("teacher")) { Teacher teacher = userDAO.loginTeacher(userId, user.getPassword()); ActionContext.getContext().getSession().put("teacher", teacher); return "teacher"; } else if (type.equals("student")) { Student student = userDAO.loginStudent(userId,user.getPassword()); ActionContext.getContext().getSession().put("student", student); return "student"; } else return "login"; }
這樣整套邏輯就通了,另外,如果不想讓其他人直接通過網站目錄訪問jsp,可以將有權限的jsp放到WEB-INF目錄下,只通過action控制。