1. 使用filter,即过滤器,如果session超时,就跳转到指定页面,可以对filter指定匹配的模式,让servlet接受请求前先通过filter。
2. 在session或其它地方暂存当前地址,隐藏域也可以,登录成功后自动跳转即可。
2. 在session或其它地方暂存当前地址,隐藏域也可以,登录成功后自动跳转即可。
解决方案 »
- Java B/S 打印解决方案
- 求:Tomcat 配置问题?
- 哪位高手教教我...关于SimpleDateFormat的时期格式大小写区分
- 一个JS的逻辑问题?
- 请教一个Struts的ActionMessages问题!
- 谁用过DB映射生成Java对象方面的工具,推荐一下
- 有人看过这个吗?
- 当XML中用CDATA包含文本中有特殊字符时,出现XML解析错误??多谢
- 高薪+股权 多人手机游戏项目招聘j2ee大牛
- 请问如何使用j2ee的范例程序?比如说有范例程序:Order.java, OrderBean.java, OrderHome.java 。请问该如何把它们加入到现有的ejb工程中
- action 中的 execute没有执行是什么原因?
- 如何把resin做成服务,当机器重启时,它也重启?
具体的用法你可以参照servlet API。
HttpSessionListener这个类是专门用来监听session的。
如何实现登陆后回到先前的 页面呢
当然楼上兄弟说的用实现HttpSessionListener接口也可以,
但我还是觉得使用Filter更简单
1。如果用listener 覆写 sessionDestroyed(HttpSessionEvent se)方法,里面如何取到session呢,没有HttpServletRequest啊,HttpSessionEvent 没有这些方法。
2。如果用filter的话代码倒是可以实现,但是我配置好以后却始终没有运行那个filter,郁闷啊,我的应用已经有Set Character Encoding filter,那个filter是运行ok的。付上web.xml配置段,filter代码。
web.xml :
<filter>
<filter-name>Session Timeout Handle</filter-name>
<filter-class>com.mao.util.filter.SessionTimeOutFilter</filter-class>
</filter>
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.mao.util.filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Session Timeout Handle</filter-name>
<url-pattern>/*.do</url-pattern>
</filter-mapping>filter 中doFilter方法:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("start to filter session timeout");
HttpServletRequest httpreq=(HttpServletRequest)request;
HttpSession session=httpreq.getSession(false);
if(session==null){
System.out.println("session timout,send redirect to jsp");
// RequestDispatcher dispatcher = null;
//dispatcher =
// getServletContext().getRequestDispatcher("/approve.jsp");
//dispatcher.forward(request, response);
HttpServletResponse httprep=(HttpServletResponse)response;
httprep.sendRedirect("sessiontimout.jsp");
}
else{
System.out.println("session doesn't timeout, continue");
// Pass control on to the next filter
chain.doFilter(request, response);
}
}
你可能要使用filter了。
因为本人觉得只有filter才能在每打开另外一个连接之前才能判断他的session是否过期。
filter就跟servlet差不多,很容易上手的!如果只是告诉服务器session过期的话可以用HttpSessionListener监听器!
当Session过期不给访问的话建议使用Filter
//MyForm myForm = (MyForm)form;
String resUrl=request.getRequestURI();
String operationUrl=request.getParameter("action");
User user = (User)request.getSession().getAttribute(Constants.SESSION_USER);
if(user!=null){
IRole cRole =(IRole)getServiceFactoryImpl().getService(ServiceFactory.ROLE_IMPL);
if(cRole.getResOpByUrl(resUrl,operationUrl)!=null){
if(!cRole.hasPrivilege(user.getRoleID(),resUrl,operationUrl)){
throw new PostException("exception.noPrivilege");
}
}
}else{
if(!resUrl.equals("/login.do")){
request.setAttribute(Constants.URL_NEXT,"/jsp/login/login.jsp");
throw new PostException("exception.session.expire");
}
}
return executeAction(mapping, form, request, response);
}catch(PostException pe){
log.error(pe);
throw pe;
}catch(NullPointerException npe){
log.error(npe);
throw new PostException("global.exception.errorLink");
}catch(DBMgrException DBe){
log.error(DBe);
throw new PostException("global.exception.systemBusy");
}catch(Exception e){
log.error(e);
throw new PostException("global.exception.unknow");
}