对比记录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; } } }
相关文章推荐
- SpringMVCAop编程(对比Struts2的拦截器)
- springMVC高级部分(数据校验,数据错误回显(自定义格式错误显示),拦截器,异常处理,文件上传,文件下载,springmvc运行流程以及springmvc和struts2对比)
- SpringMVC与Struts2的对比
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- 0108 SpringMVC与Struts2的对比【基础】
- struts2关于action拦截器使用方法 现记录如下
- 终于有SpringMvc与Struts2的对比啦
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- 笨鸟之AOP的JDKProxy和CGlibProxy动态代理的模拟及比较
- SpringMVC与Struts2的对比
- Struts2、SpringMVC、Servlet(Jsp)性能对比测试(转)
- 谈一谈struts2和springmvc的拦截器
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- struts1,struts2,springMVC对比
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- struts1,struts2,springMVC终极对比
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- SpringMVC与Struts2的对比