项⽬中AOP的实例应⽤
其中包括了权限管理、表单验证、事务管理、信息过滤、、过滤器、页⾯转发等等。
公司项⽬的应⽤:(涉及⽤户验证登录以及⽤户是否有管理员权限、⼼理⽤户权限等),还有涉及的其他⽇志管理代码就不⼀⼀举例了;/**
* 登录(登录判断)
* @author alex
*
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
//check login
Login login = MethodAnnotation(Login.class);
if (null == login) {
return true;
}
int userId = 0;
String uid = ValueByName(request, CookieUtil.SESSION_USER);
if(NumberUtils.isNumber(uid)){
userId = Integer.valueOf(uid);
}
if(userId==0 || !userService.isLogined(userId, ValueByName(request, CookieUtil.SESSION_ID))){
response.sendRedirect("/login");
return false;
}
//set user info
User user = UserById(userId);
request.setAttribute("userSession", user);
request.setAttribute("loginUsername",Username());
request.setAttribute("loginUserId",Id());
//******* 是内部测试的⼼理账户
request.setAttribute("psychologyUser", Type == *** || "*******".Cellphone()));
//check admin permission
Admin admin = MethodAnnotation(Admin.class);
if (admin!=null && !user.isAdmin()) {
response.sendRedirect("/error/no_permission");
return false;
}
return true;
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
/**
* 登录注解
* @author Alex
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
int value() default 0;
}
/**
* 管理员注解
* @author Alex
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Admin {
int value() default 0;
}
⼀般情况下,对来⾃浏览器的请求的拦截,是利⽤Filter实现的,这种⽅式可以实现Bean预处理、后处理。
Spring MVC的不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以⾮常⽅便的实现⾃⼰的。他有三个⽅法:
1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
2.        throws Exception {
3.        return true;
4.    }
5.    public void postHandle(
6.            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
7.            throws Exception {
8.    }
9.    public void afterCompletion(
10.            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
11.            throws Exception {
12.    }
分别实现预处理、后处理(调⽤了Service并返回ModelAndView,但未进⾏页⾯渲染)、返回处理(已经渲染了页⾯)
preHandle:预处理回调⽅法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器;
返回值:true表⽰继续流程(如调⽤下⼀个或处理器);
false表⽰流程中断(如登录检查失败),不会继续调⽤其他的或处理器,此时我们需要通过response来产⽣响应;postHandle:后处理回调⽅法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进⾏处理或对视图进⾏处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调⽅法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进⾏⼀些资源清理,类似于try-catch-finally中的finally,但仅调⽤处理器执⾏链中preHandle返回true的的afterCompletion。
AOP相关配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping
path="/css/**,/js/**,/img/**,/fonts/**,/stylesheets/**,/javascripts/**,/images/**,/ueditor/**" />
<bean class="com.zhaozhi.writing.service.interceptor.AssetsInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping
path="/css/**,/js/**,/img/**,/fonts/**,/stylesheets/**,/javascripts/**,/images/**,/ueditor/**" />
<bean class="com.zhaozhi.writing.service.interceptor.LoginInterceptor" />
</mvc:interceptor>
<mvc:interceptor>springboot实现aop
<mvc:mapping path="/**" />
<mvc:exclude-mapping
path="/css/**,/js/**,/img/**,/fonts/**,/stylesheets/**,/javascripts/**,/images/**,/ueditor/**" />
<bean class="com.zhaozhi.writing.service.interceptor.RoleInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping
path="/css/**,/js/**,/img/**,/fonts/**,/stylesheets/**,/javascripts/**,/images/**,/ueditor/**" />
<bean class="com.zhaozhi.writing.service.interceptor.HitlogInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。