目录
一:SpringMVC拦截器
1. 拦截器介绍
(1)拦截器的应用场景
(2)拦截器的执行原理
(3)拦截器实现的两种方式
2. HandlerInterceptor接口分析
自定义拦截器,需要实现 HandlerInterceptor 接口;并且该接口中含有三个方法:
(1)preHandle
(2)postHandle
(3)afterCompletion
3. 自定义拦截器实现权限验证
(1)改造登录方法,在session中存储用户信息,用于进行权限验证
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class WebInfAction {
// 首先要跳转到登录页面
@RequestMapping("/showLogin")
public String submit(){
System.out.println("访问login.jsp进行登录");
return "login";
}
// 跳转到login.jsp后,在进行判断
@RequestMapping("/login")
public String login(String name, String pwd, HttpServletRequest request){ // 与前端保持一致,提交的数据自动吸过来
if ("root".equalsIgnoreCase(name) && "123".equalsIgnoreCase(pwd)){
// 在session中存储用户信息(把name存进去),用于权限验证
request.getSession().setAttribute("user",name);
return "main";
}else {
request.setAttribute("msg","用户名或者密码不正确");
return "login";
}
}
}
(2)开发拦截器的功能,实现HandlerInterceptor接口,重写preHandle()方法
package com.bjpowernode.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
// 重写preHandle方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 是否登录的判断
if(request.getSession().getAttribute("user") == null){ // 能取出来,表示登录过
// 没有登录,打回到登录的页面,并给出提示
request.setAttribute("msg","请先去登录!");
request.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
// 如果登录过,就放行往下走
return true;
}
}
(3)在springmvc.xml文件中注册拦截器
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--映射要拦截的请求-->
<mvc:mapping path="/**"/>
<!--配置要放行的请求-->
<mvc:exclude-mapping path="/showLogin"/><!--登录的页面-->
<mvc:exclude-mapping path="/login"/><!--登录验证的页面-->
<!--配置具体的拦截器实现功能的类-->
<bean class="com.bjpowernode.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(4)测试:
在登录之前,我们还是知道showMain或者showIndex,直接访问是不能访问的,被拦截了
在成功登录之后,我们不关闭当前会话,重新开一个窗口, 直接访问就可以访问了