这里只是一个简单的例子,表示只有管理员才可以进行删除功能。
一、自定义注解
我们自定义一个注解,该注解注解到需要拦截的url对应的方法上
package com.rong.crud.self;
import java.lang.annotation.*;
//说明该注解将被包含在javadoc中
@Documented
//可以在方法和类上使用注解
@Target({ElementType.METHOD,ElementType.TYPE})
// 定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
@Retention(RetentionPolicy.RUNTIME)
// 子类可以继承父类中的该注解
@Inherited
public @interface MyAnnotation {
}
二、注解到对应的方法上
因为我们要对删除功能进行拦截,所以注解在这个功能上面
/**
* 删除
* @param id
* @return
*/
@MyAnnotation
@RequestMapping("/student/delete")
public String delete(@RequestParam("id") Integer id){
studentService.deleteStudent(id);
return "redirect:/index";
}
三、自定义拦截器
package com.rong.crud.interceptor;
import com.rong.crud.bean.User;
import com.rong.crud.self.MyAnnotation;
import org.springframework.ui.Model;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器");
//获得名为user的对象
Object user = request.getSession().getAttribute("user");
//判断请求的方法上是否有注解
boolean haveAnnotataion = handler.getClass().isAssignableFrom(HandlerMethod.class);
if(haveAnnotataion){
//如果有注解,判断是否是MyAnnotation
MyAnnotation ma = ((HandlerMethod)handler).getMethodAnnotation(MyAnnotation.class);
//如果存在该注解
if(ma != null) {
//判断用户名是否是admin(这里把用户名为admind的用户当作管理员)
if(!((User)user).getName().equals("admin")){
//如果不是转发到/index上
request.setAttribute("msg","你未有权限!");
request.getRequestDispatcher("/index").forward(request,response);
return false;
}
}
}
return true;
}
@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 {
}
}
这里我是转发到了/index上,可以参考一下,实际上你需要怎么实现你就怎么写
@RequestMapping("/index")
public String index(Model model, HttpServletRequest request) {
String msg =(String)request.getAttribute("msg");
List<Student> studentList = studentService.selectAllStudent();
model.addAttribute("studentList", studentList);
model.addAttribute("msg",msg);
return "index";
}
拦截器配置类,指定拦截哪种请求
package com.rong.crud.config;
import com.rong.crud.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器配置类
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
InterceptorRegistration ir = registry.addInterceptor(new MyInterceptor());
//添加拦截请求
ir.addPathPatterns("/student/*");
//添加不拦截的请求
ir.excludePathPatterns("/student/addOrUpdate");
}
}
四、实现图解
我们先以管理员的身份登录(页面写的简单):删除时就直接删除了
我们以普通用户的身份登录(这里就省略登录部分了),这是就会看到没有权限使用删除了。