拦截器的使用案例:权限控制

使用拦截器控制权限

在实际应用中,我们可以使用拦截器来控制权限,比如,这里做一个这样的小功能,判断用户名为monkey1024用户是否已登录,如果已登录,则可以访问系统的欢迎界面,否则返回禁止登录的界面。

先来定一个controller,此时需要确保该方法必须在登录之后才能访问,我们后面通过拦截器控制:

@Controller
public class LoginController {

    @RequestMapping("welcome")
    public String welcome() {

        //跳转到welcome.html
        return "welcome";
    }
}

welcome.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    欢迎登陆
</body>
</html>

登录页面login.html:

 <form action="/login" method="post">
    姓名:<input type="text" name="name"><br/>
    密码:<input type="password" name="password"><br/>
    <input type="submit" value="提交">
</form>

处理登录的controller

@RequestMapping("login")
public String login(String name,String password,HttpSession session) {

    if ("monkey1024".equals(name) && "123456".equals(password)) {
        session.setAttribute("user",name);
    }

    return "redirect:/html/success.html";

}

定义PermissionInterceptor拦截器:

package com.monkey1024.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class PermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

       //从session中获取登录数据
        String user = (String) request.getSession().getAttribute("user");
        System.out.println(request.getRequestURI());
        //判断该用户名是否是monkey1024
        if (!"monkey1024".equals(user)) {
            response.sendRedirect("/html/login.html");
            //不放行
            return false;
        }

        //放行
        return true;
    }


}

实际应用中,有些controller是不能拦截的,比如处理登录的controller,如果拦截的话,会导致无法登录,整个系统都无法使用了。此时我们可以通过在springmvc的配置文件中添加exclude-mapping设置不拦截的请求

<mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/login"/>
    <mvc:exclude-mapping path="/html/login.html"/>
    <bean class="com.monkey1024.interceptor.PermissionInterceptor"/>
</mvc:interceptor>