package com.essp.uas.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public abstract class ProxyFactory<T> implements InvocationHandler { private T target; public ProxyFactory(T target) {
super();
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object o = null;
try {
before(args);
o = method.invoke(target,args);
after(method.getName(),args);
} catch (Exception e) {
onException(e);
e.printStackTrace();
}
return o;
} @SuppressWarnings("unchecked")
public T createProxy() {
Class<T> cls = (Class<T>) target.getClass();
if (cls.getInterfaces() != null)
return (T) Proxy.newProxyInstance(cls.getClassLoader(), cls
.getInterfaces(), this);
return target;
} public abstract void onException(Exception ex); public abstract void before(Object[] args); public abstract void after(String methodName,Object[] args);
}这是我的代码,我的想法是在before方法中判断session是否过期,如果过期想在页面上弹出一个alert提示框。after是用来记录操作日志的。
我想请教如果session失效,怎么在页面上弹出一个alert提示?

解决方案 »

  1.   

    在request里面添加一个值,该值记录后台检查的session状态。
    前台页面JS检测下,如果不为空就弹出alert,为空就不跳了
      

  2.   

    session失效后 还继续工作的话 难道不会自动生成个新的session对象?
      

  3.   

    我想在before中就跳转到登录页面可以吗?不知道怎么跳转
      

  4.   

    我想在before中就跳转到登录页面可以吗?不知道怎么跳转要跳转页面要用filter或servlet。
      

  5.   

    哎~我只想通过before方法统一的判断下session过期没,如果过期就统一跳转到登录页面。这种想法怎么实现呢?
      

  6.   

    我昨天查了下,看见有网友是通过filter解决此问题的。
    所以我放弃在代理中判断session然后跳转的思路。
    现在我已经加入一个sessionfilter来过滤请求,如果session失效则在输出流中创建一个alert提示框,用户点击提示框后跳转到登录页面,本人觉得这种解决方式还不错,和大家分享下。package com.essp.uas.filter;import java.io.IOException;
    import java.io.PrintWriter;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;public class SessionFilter implements Filter {

    public void destroy() {
    } public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;  
            HttpServletResponse response = (HttpServletResponse) res;  
            HttpSession session = request.getSession();  
            // 如果session不为空,则可以浏览其他页面  
            String url = request.getServletPath();
            Object o = session.getAttribute("user");
            System.out.println(url);
            //在web.xml中,用url-pattern进行拦截映射
            if (o == null || "".equals(o)) {
                response.setContentType("text/html;charset=utf-8");  
                PrintWriter out = response.getWriter();
                String s = request.getContextPath() +  "/logout.action'";
                out.println("<script language='javascript' type='text/javascript'>");  
                out.println("alert('由于你长时间没有操作,导致Session失效!请你重新登录!');window.top.location='" + s);
                out.println("</script>");  
            } else {
             chain.doFilter(req, res);
            }
        } public void init(FilterConfig config) throws ServletException {
    }
    }