SpringMVC拦截器


一、SpringMVC拦截器配置

1.了解SpringMVC拦截器

  • 在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在 Struts 2 框架中,拦截器是其重要的组成部分,Spring MVC 框架也提供了拦截器功能。

  • Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

2.基本步骤

(1)搭配springmvc环境
参考文章:第一个SpringMVC程序

(2)编写一个拦截器类
需要继承HandlerInterceptor接口,主要是preHandle方法,后面的两个方法相当与日志。

  • preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
  • postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
  • afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
public class MyInterceptor implements HandlerInterceptor {
    //在请求处理的方法之前执行
    //如果return true;放行===执行下一个拦截器
    //如果return false;不放行===不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==处理前==");
        return false;
    }

    //在请求处理方法执行之后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("==处理后==");
    }

    //在dispatcherServlet处理后执行,做清理工作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
    }
}

(3)springmvc配置文件中配置拦截器
将我们的编写的拦截器类加载进去

/**包括路径及其子路径
/admin/*拦截的是/admin/add等等这种,/admin/add/user不会被拦截
/admin/**拦截的是/admin/下的所有
  • <mvc:interceptors> 元素用于配置一组拦截器,其子元素 <bean>定义的是全局拦截器,即拦截所有的请求。

  • <mvc:interceptor> 元素中定义的是指定路径的拦截器,其子元素 <mvc:mapping> 用于配置拦截器作用的路径,该路径在其属性 path 中定义。

<!--mvc拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--bean配置的是拦截器-->
            <bean class="com.gaolang.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

(4)测试Controller

@RestController
public class TestController {

    @RequestMapping("/test")
    public String test(){
        System.out.println("======================");
        return "OK";
    }
}

我们的preHandle的方法是return false;所以会被拦截,不会显示页面。

二、实例

验证用户是否登录,登录了才可以进入首页不然就拦截,主要是对首页的拦截,不能直接进入首页,需要登录成功后才能进入,用户没有登录点击首页的话直接跳转到登录。

  1. 拦截器类:
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果是登录页面则放行
        if (request.getRequestURI().contains("login")){
            return true;
        }

        HttpSession session = request.getSession();

        //如果用户已登录也放行
        if (session.getAttribute("user")!=null){
            return true;
        }


        //用户没有登入,直接进首页的话,跳转到登录页面
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);


        //拦截
        return false;
    }
}
  1. springmvc配置文件中配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <bean class="com.gaolang.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  1. Controller类
@Controller
@RequestMapping("/user")
public class LoginController {

    //跳转到登录页面
    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }

    //登录提交
    @RequestMapping("/login")
    public  String login(HttpSession session,String username, String pwd){
        //数据一般来自数据库,这里暂时固定 
        if (username.equals("admin")&&pwd.equals("123")){
            session.setAttribute("user",username);
            return "home";
        }else {
            return "login";
        }
    }

    //跳转到首页
    @RequestMapping("/home")
    public String home(){
        return "home";
    }

    //退出登录
    @RequestMapping("/outLogin")
    public String outLogin(HttpSession session){
//        session过期
        session.invalidate();
        return "login";
    }
}
  1. jsp页面
  • index.jsp:初始页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="${pageContext.request.contextPath}/user/home">首页</a>
  <a href="${pageContext.request.contextPath}/user/toLogin">登入</a>
  </body>
</html>
  • home.jsp首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1 align="center">首页</h1>
${user}
<a href="${pageContext.request.contextPath}/user/outLogin">注销</a>
</body>
</html>
  • login.jsp:登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1 align="center">登录页面</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
    用户名:<input type="text" name="username">
    <br>
    密码:<input type="password" name="pwd">
    <br>
    <input type="submit" value="提交">
</form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值