1、添加login.html界面
**界面路径放在templates目录下
<!DOCTYPE html>
<html lang="en" xmlns: th = "http://www.thymeleaf.org">
<head>
<title>login.html</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="/user/login" method="post">
<input name="username" placeholder="用户名" type="text"/>
<input name="password" placeholder="密码" type="password" />
<input type="submit" value="登录" />
</form>
</body>
</html>
2、编写登录控制器
package com.chenhui.springbootcrud.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.chenhui.springbootcrud.entity.User;
import com.chenhui.springbootcrud.service.UserService;
@Controller
public class LoginController {
@Autowired
private UserService userService;
@PostMapping("/user/login")
public String login(@RequestParam("username") String username,@RequestParam("pasword") String passwrod,
Map<String, Object> map){
User loginUser = userService.login(username, passwrod);
if(loginUser!=null){//登陆成功
return "hello";
}else{//登录失败
map.put("msg", "用户名密码错误");
return "login";
}
}
}
登录成功就进入hello.html界面
失败跳转到logig.html界面,并附带上失败信息。
3、实现视图映射关系
自第一步中,我们将login.html界面放在了templates目录下,templates目录下的资源是无妨直接访问的。
所以需要添加映射,下面提供两种方式:
1)、编写控制器
@RequestMapping(value = {"/","/index.html"})
public String toLogin(){
return "login";
}
输入127.0.0.1:8888/即可访问到login.html界面
2)、我们将上面的控制器注释掉,通过下面的代码实现视图映射
package com.chenhui.springbootcrud.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* 扩展mvc配置
*
* @author chenhui
* @time 2018年12月7日
* @e-mail personalmessage@foxmail.com
* @company nikey
*/
//@EnableWebMvc //完全接管webMvc配置,如果希望,可以去掉
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
}
}
编写自定义的MyMvcConfig类,需要继承org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport类,来扩展webMvc配置。(org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter类已经过时了,源码说的很清楚。)
同样能进入登录界面!
4、登录进入hello.html界面
如果密码错误
在login.html表单中添加下面代码
<p th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
上面代码表示如果msg信息不为空就展示信息!
5、防止表单重复提交
我们进入登录界面,如果刷新界面会发现表单会再次提交,为了防止表单再次提交, 我们需要在登录控制器添加一个重定向。如下:
@PostMapping("/user/login")
public String login(@RequestParam("username") String username,@RequestParam("password") String passwrod,
Map<String, Object> map, HttpSession session){
User loginUser = userService.login(username, passwrod);
if(loginUser!=null){//登陆成功
session.setAttribute("loginUser", loginUser);
return "redirect:/main.html"; //防止表单提交,重定向
}else{//登录失败
map.put("msg", "用户名密码错误");
return "login";
}
重定向到main.html界面,然后再视图映射配置中添加映射关系
registry.addViewController("/main.html").setViewName("hello");
这样我们再次登录就会看到
url中进入了main.html界面,我们在刷新机界面,就不会出现表单重复提交的问题。
上面还有一个问题,在换个浏览器我们直接输入上面的地址也会进入这个界面(没用登录的情况下)。所以我们需要添加拦截器
6、添加拦截器
package com.chenhui.springbootcrud.compent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 登录拦截器
* 登录检查
*
* @author
* @time 2018年12月8日
* @e-mail personalmessage@foxmail.com
* @company nikey
*/
public class LoginHandlerInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if(user == null){//未登录
request.setAttribute("msg", "没用权限,请先登录");
request.getRequestDispatcher("index.html").forward(request, response);
return false;
}else{//已登录
return true;
}
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
在preHandle方法中我们判断session中是否有登录信息,来进行判断用户是否是正常登录的,如果没有登录,我们进行拦截,并转发到index.html界面,返回错误信息。
配好拦截器,我们需要将拦截器交个WebMvc容器管理
package com.chenhui.springbootcrud.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import com.chenhui.springbootcrud.compent.LoginHandlerInterceptor;
/**
* 扩展mvc配置
*
* @author
* @time 2018年12月7日
* @e-mail personalmessage@foxmail.com
* @company nikey
*/
//@EnableWebMvc //完全接管webMvc配置,如果希望,可以去掉
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
registry.addViewController("/main.html").setViewName("hello");
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login");
}
}
我们拦截任何请求(除了特定的请求,如上面的 "/index.html","/","/user/login")这样我们再次直接输入http://127.0.0.1:8888/main.html就会跳转到登录界面
这样就完成了一个简单的登录功能!