这是和登录有关的拦截器
创建拦截器的实现类
重写它的3个方法
@Component
public class TestInterceptor implements HandlerInterceptor {
第一个方法:
请求在进入Handler之前, 该方法会被调用.
如果返回true, 则表示该请求会继续往下执行, 也就是才会执行到Handler
如果返回false, 就不会执行到Handler了. 并且, 另外两个方法也都不会执行
最常用的方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 因为我们使用的是注解形式的处理器(RequestMapping)
// 所以handler对象的真正类型是 HandlerMethod
HandlerMethod hm = (HandlerMethod) handler;
// 获取到该方法的注解对象
// hm.getMethodAnnotation()
HttpSession session = request.getSession();
Object user = session.getAttribute("username");
if (user != null) {
return true;
}
//重定向到登录
response.sendRedirect("/login");
return false;
}
第二个方法
Handler中的方法执行完毕之后, 向客户端返回视图之前执行
方法参数中的ModelAndView对象就是给客户端渲染所用的对象
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
第三个方法
这个请求已经给客户端完成了渲染的工作之后, 该方法会执行
在这个方法中一般会做资源清理的工作.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
在xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
<mvc:mapping path="/**"/>
<!--排除哪些地址-->
<mvc:exclude-mapping path="/category/view"/>
<mvc:exclude-mapping path="/alogin"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/book/create"/>
<mvc:exclude-mapping path="/book/delete"/>
<mvc:exclude-mapping path="/book/update"/>
<mvc:exclude-mapping path="/book/query"/>
</mvc:interceptors>
获取前端参数
package com.lanou.demo.controller;
import com.lanou.demo.annotation.CheckPermission;
import com.lanou.demo.interceptor.PermissionInterceptor;
import com.lanou.demo.service.VerifyCodeUtils;
import com.lanou.demo.service.VerifyCodeView;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Map;
@Controller
public class VerificationCodeController {
@RequestMapping("/category/view")
public ModelAndView view(HttpSession session){
//创建ModelAndView 对象
ModelAndView mv = new ModelAndView();
//取出验证码
String code = VerifyCodeUtils.generateVerifyCode(4);
//添加到ModelAndView
session.setAttribute("code",code);
mv.addObject("code",code);
//添加视图
mv.setView(new VerifyCodeView());
return mv;
}
@RequestMapping("/alogin")
public String doLogin(String username,
String password,
String code,
HttpSession session){
String sessionCode = (String) session.getAttribute("code");
if ("admin".equals(username) && "admin".equals(password)){
if (sessionCode.equalsIgnoreCase(code)){
// 验证过一次之后, 移除到验证码
session.removeAttribute("code");
//把用户名添加到session
session.setAttribute("username", username);
//获取许可证
String[] permissions = {"book/query","alogin","book/create"};
//把许可证添加到session
session.setAttribute("permissions", Arrays.asList(permissions));
// 重定向到/home页面
return "/home";
}
}
//如果不符合if判断就重定向到error页面
return "/error";
}
@CheckPermission("book/query")
@RequestMapping("/book/query")
public String select(){
return "/succeed";
}
}
要是登陆的话有些需要获取权限
配合拦截器去做一个权限设置
package com.lanou.demo.interceptor;
import com.lanou.demo.annotation.CheckPermission;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@Component
public class PermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
// 1. 从session中取出用户所拥有的权限
HttpSession session = request.getSession();
List<String> permissions = (List<String>) session.getAttribute("permissions");
// 2. 获取到当前的请求所对应的Handler上的CheckPermission注解中的value的值
HandlerMethod hm = (HandlerMethod) handler;
// 判断当前的Handler方法上是否有这个注解
if (hm.hasMethodAnnotation(CheckPermission.class)) {
// 获取到注解对象
CheckPermission annotation = hm.getMethodAnnotation(CheckPermission.class);
// 获取到value的值
String value = annotation.value();
// 判断value是否在用户权限的集合中
if (permissions.contains(value)) {
return true;
}
}
response.sendRedirect("/login");
return false;
}
}
在自定义一个注解,用来判断什么时候来使用
package com.lanou.demo.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
* 注解上面需要配置这个注解可以用到哪里:
* 例如: 是给类用的,还是给属性用的,还是给方法用的等等
*/
@Target(ElementType.METHOD)
/*
这个注解是在什么时候生效的.
是在运行时生效
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermission {
String value();
}
再在xml中配置权限的拦截器
<mvc:interceptors>
<!--登录使用的拦截器-->
<mvc:interceptor>
<!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
<mvc:mapping path="/**"/>
<!--排除哪些地址-->
<mvc:exclude-mapping path="/category/view"/>
<mvc:exclude-mapping path="/alogin"/>
<mvc:exclude-mapping path="/login"/>
<!--配置上面的地址映射会走哪个拦截器-->
<ref bean="testInterceptor"/>
</mvc:interceptor>
<!--权限使用的拦截器-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/alogin"/>
<mvc:exclude-mapping path="/category/view"/>
<ref bean="permissionInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
注意拦截器一定要使用的恰当