添加登录拦截器【springboot mybatis学习与开发(四)】

来源:互联网 发布:网络教育能读本科嘛 编辑:程序博客网 时间:2024/05/22 14:20

在前面一篇博客完成了用户登录和注册功能,当然有很多细节问题没有处理,这一篇博客,我们加一个功能,添加一个拦截器。

1、功能说明

我们前端使用了ajax技术,即登录成功之后,会进去到显示所有用户的列表页面。但这个列表页面在我们的控制器中有直接的访问路径,即不用登录也可以访问,此时我们需要加个拦截器,用户必须先登录,才能访问其他页面,否则只会留在登录界面。

2、拦截器说明

Spring Boot并没有帮我们自动配置拦截器,这个不像ViewResolver有默认的。但这也无妨,我们在前面添加映射访问路径的时候,自定义的WebMvcConfi配置类中,继承了WebMvcConfiguerAdapter,我们可以实现抽象方法,来添加拦截器,效果和一开始添加视图控制器是一样的。

2.1、登录请求

    @RequestMapping("/checkLogin")    @ResponseBody    public boolean loginUser(@RequestBody User user, Model model,HttpSession session) {        boolean result = false;        if (userService.checkLogin(user) != null) {            session.setAttribute("user", user);//将用户信息存入session中            model.addAttribute("user", user);            System.out.println("登录成功: "+user);            result = true;        }        return result;    }

登录成功之后,将用户信息存入到session中

2.2、拦截器类

首先写自定义的拦截器,实现HandlerInterceptor接口,或者继承HandlerInterceptorAdapter抽象类。

public class UserLoginInterceptor implements HandlerInterceptor {    /**     * 用来存储不拦截的路径     */    private static final String[] IGNORE_URI = {"/nothing"};    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        System.out.println("开始preHandle,判断请求是否需要拦截");        boolean flag = false;        String servletPath = request.getServletPath();        System.out.println("请求路径是: "+servletPath);        // 检测是否为需要拦截的请求        for (String s : IGNORE_URI) {            if (servletPath.contains(s)) {                System.out.println("该请求不需要拦截");                flag = true;            }        }        // 需要拦截处理的请求        if (!flag) {            // 获取存储在session域的用户            User user = (User) request.getSession().getAttribute("user");            if (user == null) {                System.out.println("拦截请求:用户未登录,禁止直接访问,返回登录页面");                request.setAttribute("message", "请先登录");                // 服务器内部转发,可以带回request                request.getRequestDispatcher("/login").forward(request, response);            }            else {                System.out.println("拦截请求:用户已经登录,可以成功浏览网页");                flag = true;            }        }        return flag;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {        System.out.println("拦截请求之后");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)            throws Exception {        System.out.println("控制器处理完成之后");    }}

从session中获取到存入的用户信息。这里拦截器的perHandle方法在调用控制器之前完成,如果返回是true才会接着执行后面的请求,否则将会停止请求。这里使用了forward方法,那么如果用户没有登录,则跳转到登录页面,这样这个拦截器的生命周期就已经结束了。这里还有个细节,就是定义了一个String[]用来存放不需要拦截的路径。

2.3注册拦截器

在自定义配置类中WebMvcCofig中重写方法

@Configurationpublic class WebMvcConfig extends WebMvcConfigurerAdapter {    //省略部分代码    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new UserLoginInterceptor()).addPathPatterns("/user/**");    }}

3、测试拦截效果

3.1、拦截请求

3.1.1、浏览器显示

image
这里由于未登录直接访问了showAllUser页面,则返回到了登录页面

3.1.2、控制台显示

image

4、心得体会

这次添加了一个简单的登录拦截器,主要还是理清楚流程。关键就是把信息存入到session中,这样在浏览器关闭之前,用户信息都会一直存在。

addPathPatterns("/user/**")

这个方法是给拦截器设置需要拦截的请求,不要设置太多的拦截路径,会造成许多没必要的拦截。

1 0
原创粉丝点击