Struts2的登录验证和session控制

 今天由于软件工程大项目的需要,我学习了下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控制。

posted on 2016-11-15 03:05  WindInWillows  阅读(2618)  评论(0编辑  收藏  举报

导航