使用拦截器控制权限
在实际应用中,我们可以使用拦截器来控制权限,比如,这里做一个这样的小功能,判断用户名为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>