HappyHeng 2020-05-28
拦截器可以在控制层Controller方法前后执行对应的操作,以实现登录拦截,权限控制等功能。
1)编写拦截器,实现HandlerInterceptor接口;
//控制层拦截器实现
public class LoginInterceptor implements HandlerInterceptor{
/**
*请求到达控制层之前执行 返回true,则放行,返回false,则拦截
*handler:请求的对象,如果是控制层请求,则为HandleMethod对象,可通过该对象获取控制层方法信息
* **/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器");
//判定handler是否为控制层方法
if (handler instanceof HandlerMethod){
HandlerMethod handlerMethod= (HandlerMethod) handler;
//获取方法名
String name=handlerMethod.getMethod().getName();
System.out.println("方法名:"+name);
Class<?> beanType = handlerMethod.getBeanType();
System.out.println("控制层类名:"+beanType.getName());
}
//去session中获取登录标识
HttpSession session = request.getSession();
User user= (User) session.getAttribute("user");
if (user!=null){//用户已登录,放行
return true;
}
//如果没有登录,则跳转到登录页面
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
/**
* 控制层方法调用之后,视图解析器解析之前执行
* modelAndView:控制层方法返回的模型视图对象
* **/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("进入拦截器postHandle方法");
if (modelAndView!=null){
System.out.println("需要跳转的页面:"+modelAndView.getViewName());
System.out.println("返回的Model数据:"+modelAndView.getModel());
System.out.println("返回的ModelMap数据:"+modelAndView.getModelMap());
modelAndView.addObject("postHandleInfo","postHandle中添加的值");
}
}
/**
* 在视图解析器之后执行,通常做一些清理工作
* **/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("进入afterCompletion方法");
}
}2)Springmvc的配置文件中配置拦截器,并指定拦截的请求和放行的请求;
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 指定要拦截的请求 /* ==>/hello,/user
/** ==>/user/hello :表示所有的请求-->
<mvc:mapping path="/**"/>
<!-- 不拦截的请求-->
<mvc:exclude-mapping path="/login"/>
<!-- 拦截器类-->
<bean id="loginInterceptor" class="interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>3)写一个控制层文件来传输数据;
@Controller
public class IndexController {
@RequestMapping("/login")
public String login(String name, String password, HttpSession session){
System.out.println("获取到前台数据:name="+name+",password="+password);
//todo 查询数据库,验证是否存在用户数据
User user=new User();
user.setName("科比");
if (user==null){//如果用户不存在,跳回登录页面
return "login.jsp";
}
//登录成功,将用户信息放入session
session.setAttribute("user",user);
return "index.jsp";
}
}4)再写一个用户登录的页面和按钮;
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login">
用户名:<input type="text" name="name"/><br/>
密码: <input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>