上一篇实现了导入静态资源、首页、国际化
(三)登录
输入正确用户名密码。点击 登录
按钮即可登录进入后台,即dashboard.html页面。
首先在index.html中添加表单提交地址
并添加name
属性方便后面传参。
在controller 包新建LoginController 类
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model){
//具体的业务
if("admin".equals(username) && "123".equals(password)){
return "dashboard";
}else{
//消息回显,需要model
model.addAttribute("msg","用户名或密码错误");
return "index";
}
}
}
}
在 index.html 文件中添加键 msg 显示错误提示文本
测试:
当输入正确用户名:admin,正确密码:123 时,进入;当输入错误信息时页面提示。
此时可以登录,但url中暴露了用户信息。编写一个映射,将dashboard 映射到main.html。
在 MyMvcConfig
类中的重写方法添加新的视图映射,
registry.addViewController("/main.html").setViewName("dashboard");
并将 LoginController 类采取重定向的方式
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model, HttpSession httpSession){
//具体的业务
if("admin".equals(username) && "123".equals(password)){
//重定向
return "redirect:/main.html";
}else{
//消息回显,需要model
model.addAttribute("msg","用户名或密码错误");
return "index";
}
}
}
此时再次登录,显示的url 就隐藏了用户信息
但此时发现,直接访问 main.html 就进入了首页,造成安全问题,故需要对一些页面进行拦截。
(四)登录拦截器
用户登录后,将用户信息存入session。
- 如果发现session为空,说明没有登录,需要拦截
- 否则,不需要拦截
在 LoginController 类中将用户信息存入session
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model, HttpSession httpSession){
//具体的业务
if("admin".equals(username) && "123".equals(password)){
httpSession.setAttribute("loginUser", username);//拦截器获取此session
//重定向
return "redirect:/main.html";
}else{
//消息回显,需要model
model.addAttribute("msg","用户名或密码错误");
return "index";
}
}
}
在 config 包中新建 LoginHandlerInterceptot 类,实现 HandlerInterceptor
接口,并重写 preHandle 方法。
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录成功之后应该有用户的session
Object userSession = request.getSession().getAttribute("loginUser");
//userSession为空,说明没有登录,需要拦截
if(userSession == null){
//告诉一个消息
request.setAttribute("msg", "没有权限, 请先登录!");
//再返回到首页
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
}else{
return true;
}
}
}
在 MyMvcConfig
类中添加拦截器,也就是重写addInterceptors 方法。注意排除登录页面及静态资源。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/index.html","/user/login","/css/**","/img/**","/js/**");
}
此时,再直接输入main.html 就会提醒,对此页面进行了拦截。