1.需求分析
- 要实现登陆判断功能,我们至少要有一个登陆页和登陆成功的页面
- 登陆的实现逻辑是用户输入用户名,前端使用ajax去把用户表中对应用户名的用户的信息全部查询出来,存在session中,当用户点击提交表单的时候就将用户输入的密码和session中的user对象的pwd属性值进行对比,相同就跳转登陆成功的页面,不同就跳转回登陆页面并提示用户密码错误
- 但是这里为了简单,我们就将用户名和密码写死在后台,用户提交数据的时候直接判断,所以也就不使用ajax来做异步查询数据了
- 登陆判断的拦截器的作用为当用户处于未登录状态的时候,不让用户访问登陆成功的页面,并将其重定向回登陆页面
2.代码实现
- 编写3个页面实现登陆验证功能
- index.jsp:用于跳转页面
- logon.jsp:用于用户登陆
- main.jsp:用户登陆之后才能进入的页面
- 之所以加一个index.jsp是因为现在的页面都不是进来就叫你登陆,然后才能使用的,而是将登陆作为一个连接放在页面上,你想登陆的时候就点击跳转登陆页面即可
- 编写一个controller来控制视图跳转和判断用户名和密码是否正确,并将用户数据存入session中
//3、判断用户名和密码是否正确 @RequestMapping("/login") public String login(String name, String pwd, HttpSession session){ System.out.println("===>进入了判断"); if ("admin".equals(name)){ if ("123".equals(pwd)){ System.out.println("===>通过了判断"); session.setAttribute("user",name); return "main"; } } return "logon"; }
- 但是现在的问题是用户不走登陆页面,可以直接请求到登陆后才能看到的首页main.jsp,这个时候我们就需要使用我们的拦截器了,因为拦截器会拦截请求controller中方法的请求,所以用户在直接请求main.jsp的时候就会被拦截器拦截下来
//3、判断用户名和密码是否正确 @RequestMapping("/login") public String login(String name, String pwd, HttpSession session, Model model){ System.out.println("===>进入了判断"); if ("admin".equals(name)){ if ("123".equals(pwd)){ System.out.println("===>通过了判断"); session.setAttribute("username",name); model.addAttribute("info",name); return "main"; } } model.addAttribute("info","账号或密码错误"); return "logon"; }
- 再添加一个注销功能
//4、注销功能 @RequestMapping("logout") public String logout(HttpSession session){ session.removeAttribute("username"); return "logon"; }
3.测试
测试完成!
注意:上面的视图跳转都是基于转发实现的,这是因为springMVC的视图跳转默认就是转发,如果要重定向,我们需要显示的在视图名称前面加一个"redirect:",但是注意:重定向不能访问web-inf文件夹下的资源(参考: SpringMVC(7) —— 结果跳转方式.)
4.小结
- 之所以springmvc要搞一个拦截器,其实就是想要减少我们使用servlet容器,而尽可能地将所有的配置都集中在spring容器中进行配置,这样可以实现使用spring容器对项目要用的组件进行统一的管理,也方便spring容器进行DI
- 而spring容器和servlet容器之间的联系是通过DispatcherServlet进行联系的