Spring基於註解的切面編程

閒話少敘,項目需要引入兩個spring依賴。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aspects</artifactId>
</dependency>

添加一個新的註解

package com.abc.action.apph5;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

/**
 * 檢查用戶是否需要訂閱
 * @author Administrator
 *
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface WeixinSubscription {
}

增加一個切面的執行類。

package com.abc.action.apph5;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;

import com.abc.constant.UserConstant;
import com.abc.entity.template.users.CompanyUsers;
import com.abc.entity.template.users.ConnectUsersKey;
import com.abc.service.template.comm.ConfigService;
import com.abc.service.template.comm.WeixinCacheAccessTokenService;
import com.abc.service.template.users.ConnectUsersService;
import com.abc.util.HttpsUnit;
import com.abc.util.PropertyUtils;
import com.alibaba.fastjson.JSONObject;

@Aspect
public class WeiXinSubscriptionAspect {
	@Autowired
	ConfigService configService;
	@Autowired
	WeixinCacheAccessTokenService weixinCacheAccessTokenService;
	@Autowired
	ConnectUsersService connectUsersService;
	
	static String wx_userinfo_api_url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN";
	Logger logger = LogManager.getLogger(WeiXinSubscriptionAspect.class);
	
	@Pointcut("@annotation(com.abc.action.apph5.WeixinSubscription)")
	public void Subscription() throws Exception {};
	
	@Around("Subscription()")
	 public String process(ProceedingJoinPoint jp) throws Throwable{
		Object[] args = jp.getArgs();
		for(Object obj:args) {
			if(obj instanceof HttpServletRequest) {
				CompanyUsers user = (CompanyUsers)((HttpServletRequest)obj).getSession().getAttribute(UserConstant.WX_USER);
				String stringByKey = configService.getStringByKey("IsNeedPublicAccount", user.getCompanyid());
				if("1".equals(stringByKey)) {
					if(!IsSubscription(user.getCompanyid(),user.getUserid())) {
						return "redirect:" + PropertyUtils.getValue("acexe_ym_apph5_path")+"/h5/Guide.jhtml";
					}	
				}
			}
		}
	    return (String)jp.proceed();//此方法調用目標方法。
	}
	
	private Boolean IsSubscription(Long companyid,Long userid) throws Exception{
		String access_token = weixinCacheAccessTokenService.GetAuthorizerAccesstoken(companyid);
		  if(access_token.equals("")) {
			  throw new Exception("CacheAccessToken is not found");
		  }
		  // 獲取用戶的openid
		  ConnectUsersKey connectUsersKey = connectUsersService.getConnectId(userid, companyid, 30);
		  String apiurl = String.format(wx_userinfo_api_url, access_token, connectUsersKey.getConnectid());
		  // 請求用戶信息
		  String retString = HttpsUnit.SendHttpsPOST(apiurl, null, null);
		  JSONObject parse = JSONObject.parseObject(retString);
		  logger.info(String.format("拉取到的用戶信息【公司:%d】【用戶ID:%d】:%s",companyid,userid, parse));
		  if(parse.containsKey("subscribe") && parse.getInteger("subscribe")==1) {
			  return true;
		  }
		  return false;
	}
}

在applicationContext.xml文件中增加切面的注入。

<!-- 切面注入 -->
	<aop:aspectj-autoproxy />
	<bean class="com.abc.action.wx.WeiXinSubscriptionAspect"/>

在代碼中使用註解。

@WeixinSubscription()
	@RequestMapping("/Money.jhtml")
	public String buygivemoney(HttpServletRequest request, HttpServletResponse response, ModelMap modelmap,
			@RequestParam("q") String packcode) throws Exception {}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章