自定义登录拦截器 HandlerInterceptor
作者:互联网
一、在项目根目录 建立 config 包,该包中主要存放 springboot配置 等java文件。
1.新建一个LoginHandlerInterceptor 检查登录的拦截器,该类要实现 HandlerInterceptor 接口 代码如下:
package com.example.springboot01.config; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器生效"+ request.getContextPath() + "被拦截!!"); if(request.getSession().getAttribute("username")==null) //检查用户是否登录 { request.setAttribute("msg","未登录,不能使用系统!!"); request.getRequestDispatcher("/").forward(request,response);//未登录直接将请求发送到 登录页面 return false; } else { return true; } } }
2.在该包下 新建 myMvcConfig.java 实现 WebMvcConfigurer 接口 具体代码如下:
package com.example.springboot01.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.WebMvcConfigurer; @Configuration //必须加此注解 public class myMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers( ViewControllerRegistry registry) { registry.addViewController("/").setViewName("login");// 将首页映射到 login 视图 } @Override public void addInterceptors(InterceptorRegistry registry) //必须覆盖该方法
{
//将刚才新建的拦截器 在此处注册 registry.addInterceptor( new LoginHandlerInterceptor()) .addPathPatterns("/**").excludePathPatterns("/","/login.html","/hello.html","/login"); // .addPathPatterns("/**") 表示匹配所有文件 。 excludePathPatterns("/","/login.html","/hello.html","/login"); 排除 首页 登录页面 } }
目录结构如下图所示
3.在 template 文件夹中新建 login.html 代码如下:
1 <!DOCTYPE html> 2 <html lang="en" 3 xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:th="http://www.thymeleaf.org"> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Title</title> 8 </head> 9 <body> 10 <form th:action="@{/login}" method="post" > 11 <div th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"> </div> 12 <div> 用户名:<input type="text" name="username" /></div> 13 <div> 密 码: <input type="password" name="password" /> </div> 14 15 <input type="submit" value="登录.." /> 16 </form> 17 </body> 18 </html>
4.在项目根目录新建 controller 包 ,目录结构如下图:
5. 在controller 中新建 HomeController 代码如下:
1 package com.example.springboot01.controller; 2 3 import com.example.springboot01.pojo.User; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.ui.Model; 7 import org.springframework.util.StringUtils; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestParam; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpSession; 13 import java.util.*; 14 15 @Controller 16 public class HomeController { 17 @Autowired //自动注入 request 18 HttpServletRequest request; 19 @Autowired //自动注入 session 20 HttpSession session=null; 21 @RequestMapping("/hello") 22 public String hello() 23 { 24 request.setAttribute("hello"," !!!"); 25 List<User> lists=new ArrayList<>() ; 26 User u=new User(1001,"葛洪"); 27 User u1=new User(1002,"李四"); 28 User u2=new User(1003,"张三"); 29 lists.add(u); 30 lists.add(u1); 31 lists.add(u2); 32 request.setAttribute("lists",lists); 33 request.setAttribute("curUser", new User()); 34 return "hello"; 35 } 36 37 @RequestMapping("/login") 38 public String login(@RequestParam("username") String username,@RequestParam("password") String password , Model model) 39 { 40 if( StringUtils.isEmpty(username) ) { 41 model.addAttribute("msg","用户名不能为空!!"); return "login"; 42 } 43 if(StringUtils.isEmpty(password)) 44 { 45 model.addAttribute("msg","密码不能为空!!"); return "login"; 46 } 47 if(username.equals("szk") && password.equals("123")) //用户名和密码都符合条件 将用户名放入 session中存储 48 { 49 50 session.setAttribute("username",username); 51 return "redirect:/main"; 52 }else 53 { 54 model.addAttribute("msg","用户名或密码错误!!"); 55 56 return "/login"; 57 } 58 } 59 60 @RequestMapping("/main") 61 public String main( Model model) 62 { 63 64 ArrayList<User> list=new ArrayList<User> (); 65 66 list.add(new User(1,"刘志明") ); 67 list.add(new User(2,"李雪") ); 68 list.add(new User(3,"曹凯宏") ); 69 list.add(new User(4,"李俊友") ); 70 model.addAttribute("list",list); 71 72 return "main"; 73 } 74 @RequestMapping("/logout") 75 76 public String logout( ) 77 { 78 79 request.getSession().removeAttribute("username"); 80 return "/login"; 81 } 82 }
注意上述 代码 login方法 主要处理 login.html 提交的请求 ,用户名、密码正确后 程序进入 主页 即 main 页面 。
6. main.html代码如下:
1 <!DOCTYPE html> 2 <html lang="en" 3 xmlns:th="www.thymeleaf.org" 4 > 5 <head> 6 <meta charset="UTF-8"> 7 <title>主页</title> 8 </head> 9 <body> 10 这是主页 11 12 <p th:each="item: ${list} " > 13 [[${item.getUid() }]] -- [[${item.getName() }]] 14 15 16 </p> 17 18 <a href="/logout"> 注销登录</a> 19 </body> 20 </html>
main 方法代码 如下:
@RequestMapping("/main") 61 public String main( Model model) 62 { 63 64 ArrayList<User> list=new ArrayList<User> (); 65 66 list.add(new User(1,"刘志明") ); 67 list.add(new User(2,"李雪") ); 68 list.add(new User(3,"曹凯宏") ); 69 list.add(new User(4,"李俊友") ); 70 model.addAttribute("list",list); 71 72 return "main"; 73 }
用户访问首页 (login.html)登录后即可进入主页,用户未登录进入主页后 程序直接跳转的login页面 提示用户登录后 再访问。
按照以上操作即可完成 用户登录认证。
标签:拦截器,自定义,request,list,User,new,import,login,HandlerInterceptor 来源: https://www.cnblogs.com/sunzzhankui/p/15582767.html