SpringMVC_06自定义拦截器

所谓拦截器就是起一个拦截的作用相当于是一个门卫,主要用于限制对地址的访问,其主要拦截的是action,不拦截jsp路径

在拦截器中有三个重要的方法

1.preHandle

进入Handler方法之前执行,一般用于权限身份验证

2.postHandle

进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图

3.afterCompletion

执行Handler完成后执行,一般用于统一异常处理,日志操作

下面写一个登录案例的拦截来加深对拦截器的理解

流程为运行login.jsp,然后进行跳转到LoginControll这个类,进行逻辑的处理,如果登录成功则session的内容为做一定的记录。之后访问其他的界面的时候先检查是否为登录界面,是的话就直接通过,再检查是否登录成功,如果登录成功的话便可以直接访问,如果没有的话则被拦截。

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
	<form action="login.action" method="post">
		用户:<input type="text" name="name"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="登录">
	</form>
</body>
</html>

LoginController.java

package controller;

import javax.servlet.http.HttpSession;

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

import bean.User;

@Controller
public class LoginController {
	@RequestMapping("/login.action")
	public String login(User user,HttpSession session) {
		if("admin".equals(user.getName())&&"123".equals(user.getPassword())) {
			System.out.println("登录成功");
			session.setAttribute("login", "success");
		}
		return "result";
	}
	
}

MyInterceptor.java

package interceptor;

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

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
 * 此拦截器是用来拦截登录后的
 * @author Admin
 *
 */
@Component
public class MyInterceptor implements HandlerInterceptor {

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		//执行Handler完成后执行,统一异常处理,日志操作
		System.out.println("afterCompletion:执行Handler完成后执行,统一异常处理,日志操作");
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		//进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图
		System.out.println("postHandle:进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图");
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
		//进入Handler方法之前执行,权限身份验证
		System.out.println("preHandle:进入Handler方法之前执行,权限身份验证");
		String uri=request.getRequestURI();
		if(uri!=null&&uri.indexOf("login.action")>=0) {
			return true;
		}
		HttpSession session=request.getSession();
		if(session.getAttribute("login").equals("success")) {
			return true;
		}
		request.getRequestDispatcher("login.jsp").forward(request, response);
		return false;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_40374295/article/details/81239864