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域,在登录界面取出并显示)