简介

什么是拦截器?我们平时访问网页时,有首页还有其他一些页面或者操作我们不用注册登录就能访问和操作,而有些页面或操作却不能,点击之后总会跳转到注册登录页或者给出需要登录的提示。点击后被迫跳转的页面就是通过拦截器拦截后转发过去的。

简单的登录测试

拦截器怎么实现,拦截器拦截的是请求,配置的DispatchServlet分发请求后会将各类请求交给实现请求的方法,这时我们可以根据请求的不同进行拦截索要进行拦截测试的请求。
导入所需依赖,增加一个拦截器配置。

  1. <!--拦截器配置-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--/** 包括当前请求后所有的请求 例:/login/add/delete/......-->
  5. <!--/admin/** 包括admin请求后所有的请求 例:/login/add/delete/......-->
  6. <mvc:mapping path="/admin/**"/>
  7. <bean class="com.sy.interceptor.LoginInterceptor"/>
  8. </mvc:interceptor>
  9. </mvc:interceptors>

1、一个简单的登录

写一个简单的登录请求流程:前端点击输入框输入账号密码点击登录按钮,后端收到请求将登录请求实现将所需展示内容存入视图中返回给前端页面展示。

1.1、输入框以及登录按钮

login.jsp

  1. <form action="${pageContext.request.contextPath}/admin/login" method="post">
  2. username:<input type="text" name="username">
  3. password:<input type="text" name="password">
  4. <input type="submit" value="登录">
  5. </form>

1.2、请求处理方法

package ...
import ...

@Controller
@RequestMapping("/admin")
public class LoginController {

    @RequestMapping("/login")
    public String login(HttpSession session, String username, String password, Model model){
        session.setAttribute("userNameInfo",username);
        session.setAttribute("userPassWordInfo",password);
        model.addAttribute("username",username);
        model.addAttribute("password",password);
        System.out.println("username:"+username);
        System.out.println("password:"+password);
        return "main";
    }

1.3、返回页面

main.jsp

<P><span>${username}</span>,这是一个首页!</P>

2、加入拦截器

package ...
import ...

public class LoginInterceptor implements HandlerInterceptor {

    /**
     * return true时会放行,即执行下一个拦截器。
     *        false时不放行,即不执行下一个拦截器。
     *        下一个拦截器:拦截器可能有多个,如用户请求拦截器或病毒拦截器等恶意请求拦截器。
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截处理前...");
        System.out.println("<------------------>");
        return true;
    }
}

2.1拓展跳转页面

欢迎页index.jsp,选择进入首页(admin请求下的main请求)或者登录(admin请求下的goLogin请求)两个请求操作。

  <body>
  <a href="${pageContext.request.contextPath}/admin/main">首页</a>
  <a href="${pageContext.request.contextPath}/admin/goLogin">登录</a>
  </body>

2.2增加多个请求

运行后在欢迎页选择首页操作请求,进行admin下的main请求,请求完成返回到login.jsp页面。输入框填入内容登录按钮点击后,进行admin请求下的login请求,请求完成返回到main.jsp页面。main.jsp增加登出功能,点击登出进行admin请求下的logout请求,请求完成转发到欢迎页。

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

    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login";
    }
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        /**
         * removeAttribute()
        * 移除节点
        */
        session.removeAttribute("userNameInfo");
        session.removeAttribute("userPassWordInfo");
        return "redirect:/index.jsp";
    }

2.3加入拦截条件

设在未登录情况下不可以访问main.jsp,则在login请求发生或goLogin请求产生并且输入框都填写之后才不进行拦截否则都进行拦截。则条件判断为:在request.getRequestURI().contains(“goLogin”) || request.getRequestURI().contains(“login”)条件限制下进行request.getParameter(“username”)!= null && request.getParameter(“password”) != null的判断。

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截处理前...");
        System.out.println("<------------------>");
        if (request.getRequestURI().contains("goLogin") || request.getRequestURI().contains("login")){
            System.out.println("判断了url路径");
            System.out.println("<------------------>");
            System.out.println("开始判断账号密码是否输入");
            /*System.out.println(request.getSession().getAttribute("userNameInfo"));*/
            if(request.getParameter("username")!= null && request.getParameter("password") != null){
                System.out.println("判断了账号密码");
                System.out.println("账号密码都输入了!");
                System.out.println("<------------------>");
                return true;
            }
        }
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
        System.out.println("拦截器生效!转发至登录页面!!");
        return false;
    }

2.4运行示意

选择首页请求(本应该跳转到main.jsp,拦截器生效被拦截,转发至登录页)
image.png
完成输入条件(拦截器放行进入main.jsp)
image.png
点击登出(应该被转发到首页去,被拦截器拦截转发到登录页)
image.png