SpringBoot实现登录拦截器(实战版)

沙海 2021年6月1日04:27:37Java评论24字数 5189阅读17分17秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/27880.html

只需一次登录,如果登录过,下一次再访问的时候就无需再次进行登录拦截,可以直接访问网站里面的内容了。在登录成功之后,将user信息保存到session中,下一次登录时浏览器根据自己的SESSIONID就可以找到对应的session,就不要再次登录了,可以从Chrome浏览器中看到。文章源自JAVA秀-https://www.javaxiu.com/27880.html

原文约 1706 | 图片 6 | 建议阅读 4 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/27880.html

SpringBoot实现登录拦截器(实战版)

Java学习者社区 文章源自JAVA秀-https://www.javaxiu.com/27880.html

SpringBoot实现登录拦截器(实战版)文章源自JAVA秀-https://www.javaxiu.com/27880.html

对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在SpringBoot开发的项目中,通过实现拦截器来实现用户登录拦截并验证。文章源自JAVA秀-https://www.javaxiu.com/27880.html

1、SpringBoot实现登录拦截的原理

SpringBoot通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过@Configuration注解注入配置.文章源自JAVA秀-https://www.javaxiu.com/27880.html

1.1、实现HandlerInterceptor接口

实现HandlerInterceptor接口需要实现3个方法:preHandlepostHandleafterCompletion.文章源自JAVA秀-https://www.javaxiu.com/27880.html

3个方法各自的功能如下:文章源自JAVA秀-https://www.javaxiu.com/27880.html

package blog.interceptor;import blog.entity.User;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class UserLoginInterceptor implements HandlerInterceptor {    /***     * 在请求处理之前进行调用(Controller方法调用之前)     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("执行了拦截器的preHandle方法");        try {            HttpSession session = request.getSession();            //统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)            User user = (User) session.getAttribute("user");            if (user != null) {                return true;            }            response.sendRedirect(request.getContextPath() + "login");        } catch (Exception e) {            e.printStackTrace();        }        return false;        //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作        //如果设置为true时,请求将会继续执行后面的操作    }    /***     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)     */    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("执行了拦截器的postHandle方法");    }    /***     * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("执行了拦截器的afterCompletion方法");    }}

preHandle在Controller之前执行,因此拦截器的功能主要就是在这个部分实现:文章源自JAVA秀-https://www.javaxiu.com/27880.html

  • 检查session中是否有user对象存在;文章源自JAVA秀-https://www.javaxiu.com/27880.html

  • 如果存在,就返回true,那么Controller就会继续后面的操作;文章源自JAVA秀-https://www.javaxiu.com/27880.html

  • 如果不存在,就会重定向到登录界面。就是通过这个拦截器,使得Controller在执行之前,都执行一遍preHandle.文章源自JAVA秀-https://www.javaxiu.com/27880.html

1.2、实现WebMvcConfigurer接口,注册拦截器

实现WebMvcConfigurer接口来实现一个配置类,将上面实现的拦截器的一个对象注册到这个配置类中.文章源自JAVA秀-https://www.javaxiu.com/27880.html

package blog.config;import blog.interceptor.UserLoginInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class LoginConfig implements WebMvcConfigurer {    @Override    public void addInterceptors(InterceptorRegistry registry) {        //注册TestInterceptor拦截器        InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());        registration.addPathPatterns("/**"); //所有路径都被拦截        registration.excludePathPatterns(    //添加不拦截路径                "/login",                    //登录路径                "/**/*.html",                //html静态资源                "/**/*.js",                  //js静态资源                "/**/*.css"                  //css静态资源        );    }}

将拦截器注册到了拦截器列表中,并且指明了拦截哪些访问路径,不拦截哪些访问路径,不拦截哪些资源文件;最后再以@Configuration注解将配置注入。文章源自JAVA秀-https://www.javaxiu.com/27880.html

1.3、保持登录状态

只需一次登录,如果登录过,下一次再访问的时候就无需再次进行登录拦截,可以直接访问网站里面的内容了。文章源自JAVA秀-https://www.javaxiu.com/27880.html

在正确登录之后,就将user保存到session中,再次访问页面的时候,登录拦截器就可以找到这个user对象,就不需要再次拦截到登录界面了.文章源自JAVA秀-https://www.javaxiu.com/27880.html

@RequestMapping(value = {"", "/", "/index"}, method = RequestMethod.GET)public String index(Model model, HttpServletRequest request) {    User user = (User) request.getSession().getAttribute("user");    model.addAttribute("user", user);    return "users/index";}@RequestMapping(value = {"/login"}, method = RequestMethod.GET)public String loginIndex() {    return "users/login";}@RequestMapping(value = {"/login"}, method = RequestMethod.POST)public String login(@RequestParam(name = "username")String username, @RequestParam(name = "password")String password,                    Model model, HttpServletRequest request) {    User user = userService.getPwdByUsername(username);    String pwd = user.getPassword();    String password1 = MD5Utils.md5Code(password).toUpperCase();    String password2 = MD5Utils.md5Code(password1).toUpperCase();    if (pwd.equals(password2)) {        model.addAttribute("user", user);        request.getSession().setAttribute("user", user);        return "redirect:/index";    } else {        return "users/failed";    }}

2、代码实现及示例

代码实现如上所示。文章源自JAVA秀-https://www.javaxiu.com/27880.html

在登录成功之后,将user信息保存到session中,下一次登录时浏览器根据自己的SESSIONID就可以找到对应的session,就不要再次登录了,可以从Chrome浏览器中看到。文章源自JAVA秀-https://www.javaxiu.com/27880.html

SpringBoot实现登录拦截器(实战版)文章源自JAVA秀-https://www.javaxiu.com/27880.html

3、效果验证

3.1、访问localhost:8081/index页面:

SpringBoot实现登录拦截器(实战版)文章源自JAVA秀-https://www.javaxiu.com/27880.html

被重定向到了localhost:8081/login,实现了登录拦截。文章源自JAVA秀-https://www.javaxiu.com/27880.html

3.2、正确输入用户名和密码登录

SpringBoot实现登录拦截器(实战版)文章源自JAVA秀-https://www.javaxiu.com/27880.html

3.3、再次访问localhost:8081/index

SpringBoot实现登录拦截器(实战版)文章源自JAVA秀-https://www.javaxiu.com/27880.html

没有再次被登录拦截器拦截,证明可以保持登录。文章源自JAVA秀-https://www.javaxiu.com/27880.html

(感谢阅读,希望对你所有帮助)文章源自JAVA秀-https://www.javaxiu.com/27880.html

来源:blog.csdn.net/qq_27198345/article/details/111401610文章源自JAVA秀-https://www.javaxiu.com/27880.html

推荐阅读• 熟练掌握 MyBatis-Plus,一篇就够!• 牛逼!下一代 Docker 镜像构建神器• 你向 MySQL 数据库插入 100w 条数据用了多久?• 赞!推荐一款神仙颜值的 Redis 客户端工具最近面试BATJ,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。文章源自JAVA秀-https://www.javaxiu.com/27880.html

谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/27880.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定