您的位置:首页 > 编程语言 > Java开发

对比记录JDKproxy,cglibProxy,struts2拦截器,springMVC拦截器

2017-03-08 00:00 323 查看
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy implements InvocationHandler {

private Object targetObject;
private TransactionManager manager;

public JdkProxy(Object targetObject, TransactionManager manager) {
super();
this.targetObject = targetObject;
this.manager = manager;
}
//通过代理主题角色必须返回一个经过代理之后的对象,实现接口(IEmpService)
//通过jdk在内存生成一个类实现IEmpService接口
public Object proxyInstance(){

return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object resultObject=null;
try {
if("get".equals(method.getName())){

resultObject = method.invoke(targetObject, args);
}else {
manager.begin();
resultObject = method.invoke(targetObject, args);
manager.commit();
}
} catch (Exception e) {
e.printStackTrace();
manager.rollback();
} finally {
manager.close();
}
return resultObject;
}
}

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
//传入的targetObject不用实现接口,但不能配置final类
public class CglibProxy implements MethodInterceptor {

private Object targetObject;
private TransactionManager manager;

public CglibProxy(Object targetObject, TransactionManager manager) {
super();
this.targetObject = targetObject;
this.manager = manager;
}
//通过代理主题角色必须返回一个经过代理之后的对象,实现接口(IEmpService)
//通过jdk在内存生成一个类实现IEmpService接口
public Object proxyInstance(){
//实例化一个增强对象
Enhancer enhancer = new Enhancer();
//添加对targetObject目标对象的增强,传入字节码
enhancer.setSuperclass(targetObject.getClass());
//添加一个对当前类的回调
enhancer.setCallback(this);
//创建代理类,并返回
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
Object resultObject=null;
try {
if("get".equals(method.getName())){

resultObject = method.invoke(targetObject, args);
}else {
manager.begin();
resultObject = method.invoke(targetObject, args);
manager.commit();
}
} catch (Exception e) {
e.printStackTrace();
manager.rollback();
} finally {
manager.close();
}
return resultObject;
}
}

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor {

@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object user = ActionContext.getContext().getSession().get("user");
//可以通过getProxy()获取访问Action的一些信息;
//invocation.getProxy().getActionName();
//invocation.getProxy().getMethod();
//invocation.getProxy().getAction().getClass();
if(user==null){
//没登录
return "login";
}else{
// 登录放行
return invocation.invoke();

}

}

}

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import redis.clients.jedis.JedisCluster;

import com.sxb.web.commons.constant.Attributes;
import com.sxb.web.commons.constant.logistics.LogisticsConstant;
import com.sxb.web.commons.constant.redis.LogisticsRedisKeys;
import com.sxb.web.commons.holder.LoginContextHolder;
import com.sxb.web.commons.util.HttpUtil;
import com.sxb.web.commons.util.RetUtil;
import com.sxb.web.db.logistics.model.Admin;

public class SxbLoginAuthInterceptor extends HandlerInterceptorAdapter {

private static final Logger logger = Logger.getLogger(SxbLoginAuthInterceptor.class);

@Resource(name="jedisCluster")
private JedisCluster  jc;

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Object adminObj = request.getSession().getAttribute(LogisticsConstant.SxbUser_In_Session);
if (adminObj != null && adminObj instanceof Admin) {
Admin admin = (Admin)adminObj;
String key = LogisticsRedisKeys.Sxb_User_Account_Prefix+admin.getAccount();
Long ttl = jc.ttl(key);
String redisToken = jc.hget(key, "token");
String redisIsStop = jc.hget(key, "isStop");
if (ttl < 0) {
logger.warn("redis was expire");
HttpUtil.writer(request, response, RetUtil.getRetValue(false, "会话已过期,请重新登录",Attributes.ReturnCodeValue_SessionExpiration), LogisticsConstant.Sxb_Login_PATH);
return false;
}
String token = admin.getToken();
if (token.equals(redisToken)) {
if (redisIsStop.equals("1")) {
HttpUtil.writer(request, response, RetUtil.getRetValue(false, "该用户已被系统管理员停用",Attributes.ReturnCodeValue_Stop), LogisticsConstant.Sxb_Login_PATH);
return false;
}
LoginContextHolder.setAdmin(admin);
return true;
}else{
HttpUtil.writer(request, response, RetUtil.getRetValue(false, "该账号已被他人登录,若不受信任,请及时修改密码。",Attributes.ReturnCodeValue_StatusChange), LogisticsConstant.Sxb_Login_PATH);
return false;
}
}else{
logger.warn("session was expire");
HttpUtil.writer(request, response, RetUtil.getRetValue(false, "会话已过期,请重新登录",Attributes.ReturnCodeValue_SessionExpiration), LogisticsConstant.Sxb_Login_PATH);
return false;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: