使用SpringMVC拦截器实现登录权限控制

462 阅读2分钟

1.思路

配一个登录拦截器,从session域中找是否有用户对象,没有则说明还未登录,此时不放行,并跳转到登录界面。

登录成功则将用户的对象存进session域,登录失败则跳转回登录界面

2.登录拦截器:

/**
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取session域
        HttpSession session = request.getSession();
        //判断session域中是否有用户对象
        User user = (User) session.getAttribute("user");
        //判断user对象是否为null
        if (user == null) {
            //没登录,重定向到登录界面
            response.sendRedirect("/login.jsp");
            //不放行
            return false;
        }
        //登陆了,放行
        return true;
    }
}
<!--配置拦截器-->
<mvc:interceptors>
    <!--配置登录拦截器-->
    <mvc:interceptor>
        <!--拦截资源路径-->
        <mvc:mapping path="/**"/>
        <!--放行登录请求-->
        <mvc:exclude-mapping path="/user/login"/>
        <!--拦截器Bean-->
        <bean class="com.itheima.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

注意:这里必须要对登录请求进行放行,否则即使用户名密码都输对了,也无法处于登录状态(登录的请求根本就没被放行,自然无法登录成功)

3.dao层登录代码:

/**
 *登录
 */
@Override
public User login(String username, String password) {
    //注意:这里如果没查到,不会返回null,而是直接抛异常,所以需要在service层捕获一下
    return jdbcTemplate.queryForObject("select * from sys_user where username=? and password=?",new BeanPropertyRowMapper<>(User.class),username,password);
}

注意:这里如果用户名和密码是错的,不会返回null,而是直接抛出异常,所以需要在service层try-catch捕获异常,捕获到了,说明登录失败,返回null

4.service层登录代码:

@Override
public User login(String username, String password) {
    try {
        return userDao.login(username, password);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

5.控制层代码:

/**
 *登录
 */
@RequestMapping("/login")
public String login(String username, String password, HttpSession session) {
    //调用登录方法
    User user = userService.login(username, password);
    if (user != null) {
        //登录成功,把用户对象存进session域
        session.setAttribute("user",user);
        //跳转到主页
        return  "main";
    }
    //登录失败,转发到登录
    System.out.println("登录失败");
    return "forward:/login.jsp";
}

6.总结

使用拦截器实现登录权限控制的步骤:

1.编写拦截器,配置拦截器(要对登录请求放行)

2.编写登录业务代码

优化点:

本例中登录失败是直接跳转回登录界面的,缺少友好的用户提示,可以改进(如将失败信息存进requst域,在登录界面取出并显示)