查看: 1867|回复: 0

[Java代码] 应用市场中Java拦截器和切面的使用实例详解

发表于 2018-2-25 08:00:00

相信大家对拦截器和切面的概念已经不陌生了,本文我们就看一些在应用市场中,拦截器和切面的使用是怎样的。

拦截器的使用:每次接收到某个请求之前,都会调用此拦截器中的方法,其中preHandle方法如果return true,表示继续调用对应的controller,如果return false,

  1. public class CheckLoginInterceptor implements HandlerInterceptor {
  2. private Logger logger = Logger.getLogger(CheckLoginInterceptor.class);
  3. private static String TOKEN_VALID_MSG ;
  4. static
  5. {
  6. TOKEN_VALID_MSG=JsonUtil.writeObject2JSON(new AMSResultVO(CodeNum.TOKEN_VALID, CodeMessage.TOKEN_VALID));
  7. }
  8. public Boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9. //request.getMethod获取请求是get,post等
  10. if ("OPTIONS".equals(request.getMethod()))
  11. {
  12. // 指定允许其他域名访问
  13. response.setHeader("Access-Control-Allow-Origin", "*");
  14. // 响应类型
  15. response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  16. // 响应头设置
  17. response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header");
  18. response.setStatus(204);
  19. return true;
  20. }
  21. // 获取从header中得到的数据
  22. String userName = request.getHeader(CommonConsts.PARAM_USER_NAME);
  23. String userToken = request.getHeader(CommonConsts.PARAM_USER_TOKEN);
  24. Boolean result = true;
  25. String method = request.getRequestURI();
  26. if(method.equals("/ams/fileUpload"))
  27. {
  28. return true;
  29. }
  30. if(StringUtil.isEmpty(userName) || StringUtil.isEmpty(userToken))
  31. {
  32. result = false;
  33. } else
  34. {
  35. result = TokenUtil.validToken(userName, userToken);
  36. }
  37. // token校验失败
  38. if(!result)
  39. {
  40. response.setContentType("text/html;charset=UTF-8");
  41. response.getWriter().print(TOKEN_VALID_MSG);
  42. response.getWriter().flush();
  43. response.getWriter().close();
  44. }
  45. return result;
  46. }
  47. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  48. }
  49. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  50. }
  51. }
复制代码

切面的使用:

  1. //坏绕通知:需要携带ProceedingJoinPoint类型的参数
  2. //环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法
  3. //且环绕通知必须有返回值,返回值即目标方法的返回值。
  4. @Around("execution(* com.sowell.controller.*Controller.*(..))")
  5. public Object aroundMethod(ProceedingJoinPoint pjd) {
  6. Object result = null;
  7. String methodName = pjd.getSignature().getName();
  8. Object args = Arrays.asList(pjd.getArgs());
  9. //执行目标方法
  10. try {
  11. logger.info("request channels begin, param{pageNum:" + methodName + ", pageSize:" + args);
  12. //前置通知,表示在此之前的代码会在调用controller之前调用
  13. result = pjd.proceed();
  14. recordOprationLog(result, methodName, result);
  15. //后置通知
  16. logger.info("Arround:The method "+ methodName+" ends");
  17. }
  18. catch (Throwable e) {
  19. e.printStackTrace();
  20. //异常通知
  21. logger.error("Arround:The method "+ methodName+"occurs exception:"+e);
  22. //throw new RuntimeException(e);
  23. //不抛出异常的话,异常就被上面抓住,执行下去,返回result,result值为null,转换为int
  24. }
  25. //返回通知
  26. logger.info("Arround:The method "+ methodName+" ends with the Result "+ result);
  27. return result;
  28. }
复制代码

总结

以上就是本文关于应用市场中Java拦截器和切面的使用实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!



回复

使用道具 举报