SpringMVC的拦截器以及登录功能的实现

SpringMVC的拦截器以及登录功能的实现,第1张

在SpringMVC中的拦截器和Servlet过滤器Filter有些相似,可以对处理器进行预处理和后处理。

我们可以自定义自己的拦截器,我们可以继承实现了HandlerInterceptor接口的类。

在HandlerInterceptor中有三个方法:

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

首先,preHandle()方法会在业务处理器处理请求之前被调用,返回值是boolean类型。当返回值为false时,表示请求结束,后续的HandlerInterceptor以及Controller的方法都不会执行;当返回值为true时,preHandle()放行,会一次执行后续的HandlerInterceptor以及Controller的方法;

其次,postHandle()方法会在请求方法执行之后被调用,也就是Controller方法执行之后被调用。postHandle()会在DispatcherServlet 进行视图返回渲染之前被调用;

然后,afterCompletion()方法在整个请求结束后才执行,用于资源的清理。

springmvc.xml文件中配置拦截器:


    
        
            
            
            
        
    

写一个TestController测试:

package com.yhx.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/t1")
    public String test() {
        System.out.println("TestController==>test()执行了");
        return "OK";
    }
}

 我们可以用拦截器帮助我们实现一个用户登录的功能,如果不使用拦截器直接写登录的话,就可以不填密码就可以进行登录了。通过直接在url上输入对应请求就可以跳过登录,这样就与我们的设计不符合了,设置登录就是为了身份验证,这样就没有达到我们的需求。

新建一个maven项目,命名为Login:

pom.xml:



    
        SpringMVC
        com.yhx
        1.0-SNAPSHOT
    
    4.0.0

    Login

    
    
        
            junit
            junit
            4.12
        
        
            org.springframework
            spring-webmvc
            5.1.9.RELEASE
        
        
            javax.servlet
            servlet-api
            2.5
        
        
            javax.servlet.jsp
            jsp-api
            2.2
        
        
            javax.servlet
            jstl
            1.2
        
    


    
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                false
            
            
                src/main/resources
                
                    **/*.properties
                    **/*.xml
                
                false
            
        
    


web.xml:




    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext.xml
        
        1
    
    
        springmvc
        /
    


    
        encoding
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
    
    
        encoding
        /*
    

applicationContext.xml:




    
    
    
    

    

    
        
            
                
            
            
                
                    
                        
                    
                
            
        
    

    
    
        
        
        
        
    

    
    
        
            
            
            
            
        
    

编写一个登录页:

login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title






${msg}
用户名:
密码:

编写一个首页main.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


${msg}
注销


写一个登录的控制器LoginController.java:

package com.yhx.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @RequestMapping("/main")
    public String main() {
        return "main";
    }

    @RequestMapping("/goLogin")
    public String login() {
        return "login";
    }

    @RequestMapping("/login")
    public String login(HttpSession session, String username, String password , Model model) {
        if (username.equals("admin")&&password.equals("123456")) {
            session.setAttribute("user",username);
            session.setAttribute("username",username);
            session.setAttribute("password",password);
            model.addAttribute("msg","登录成功");
            return "main";
        } else {
            model.addAttribute("msg","登录失败");
            return "login";
        }



    }

    @RequestMapping("/goOut")
    public String goOUt(HttpSession session) {
        session.invalidate();
        return "login";
    }

}

拦截器LoginInterceptor.java:

package com.yhx.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();

        if (request.getRequestURI().contains("goLogin")) {
            return true;
        }

        if (request.getRequestURI().contains("login")) {
            return true;
        }

        if (session.getAttribute("user")!=null) {
            return true;
        } else {
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;
        }


    }
}

服务器的欢迎首页index.jsp直接到goLogin请求:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  
    $Title$
  
  
  
  

项目的目录结构如下:

直接输入main并不会跳转: 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/723232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存