高分悬赏!!!安全登出问题,logout!!!

zhai_xagloo 2010-05-11 11:00:41
一个按钮(logout),点了他就登出。。。不输入账户不能进入到系统。。。

我的问题是,点了logout,但是点浏览器会退按钮一样可以进入到系统。
求,解决方法。
高人解答。。。
...全文
371 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2010-05-11
  • 打赏
  • 举报
回复
写一个保护jsp,就叫protect.jsp
代码
<%
response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server
response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance
response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility

//cookies
User user = (User)session.getAttribute(Constants.LOGGED_USER_INFO);
User _user = null;
UserBusiness business = new UserBusiness();
if(user==null && (_user=business.isCookieValid(request)) == null){
response.sendRedirect(this.getServletContext().getContextPath()+"/index.jsp");
}
if(_user!=null){
user = _user;
}
%>

在你需要用户登陆后才可以访问的jsp里面,<%include page="protect.jsp"%>


搞定.
焙焙龙 2010-05-11
  • 打赏
  • 举报
回复
是浏览器页面缓存的问题,可以考虑在页面中加入no-cache选项
后退的话直接就是读缓存的。
czp3158 2010-05-11
  • 打赏
  • 举报
回复
对就是在你点击退出的时候关闭当前页~!并把session清空~!
秋9 2010-05-11
  • 打赏
  • 举报
回复

证书登录,登出,一般都是通过关闭浏览器来达到登出效果
afeny 2010-05-11
  • 打赏
  • 举报
回复
根本看不明白 还有日语 日
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
判断登陆的:
package smc.web.action;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.io.IOException;
import smc.web.form.*;
import smc.session.login.*;
import smc.toolkit.jndi.CJndiNamesFactory;
import smc.toolkit.*;
import smc.toolkit.dto.status.CPrintStatusDTO;
import java.util.*;

public class CLoginAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {

/*
Properties properties = System.getProperties();
Enumeration enmu = properties.keys();
while(enmu.hasMoreElements())
{
String strKey = (String)enmu.nextElement();
String strValue = (String)properties.getProperty(strKey);
System.out.println(strKey + ":" + strValue);
}
*/

response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
String strError = "";
//
// String op = request.getParameter("op");
// System.out.println("op.........." + op);
// if (op != null) {
//
// //request.getSession().invalidate();
//
// return mapping.findForward("loginagin");
// } else {

/*
Enumeration enu = request.getHeaderNames();
while(enu.hasMoreElements())
{
String strHeader = (String)enu.nextElement();
System.out.println(strHeader +":" + request.getHeader(strHeader));
}
*/
System.out.println("Url: " + request.getRequestURL());

int nReturn = 0;
try {
CLoginInfoHome loginInfoHome =
(CLoginInfoHome) CEJBHomeFactory.getFactory().lookUpHome(
CLoginInfoHome.class,
CJndiNamesFactory.JNDI_LOGIN);
CLoginInfo loginInfo = loginInfoHome.create();

CLoginForm loginForm = (CLoginForm) form;
String strUser = loginForm.getStrUser();
String strPassword = loginForm.getStrPassword();

if (loginInfo.isFirstLogin()) {
return mapping.findForward("menuPage");
}
nReturn = loginInfo.isLoginValid(strUser, strPassword);

if (nReturn == 0) {
request.getSession().invalidate();
request.getSession().setAttribute("User", strUser);

//save client os infomation
String strUserAgent =
(String) request.getHeader("User-Agent");
System.out.println(strUserAgent);
getClientOSType(strUserAgent, request);

CPrintStatusDTO statusDTO;
if (request.getSession().getAttribute("printStatusDTO")
== null) {
statusDTO = new CPrintStatusDTO();
statusDTO.clear();
if (loginInfo.isPrintLogin(strUser)) {
statusDTO.setStrLoginType("PRINT");
statusDTO.setStrLoginPrintCom(
loginInfo.getPrintcom());
if (smc
.toolkit
.database
.util
.CUpdateDatabase
.isPrintComHasFtp(loginInfo.getPrintcom()))
//statusDTO.getStrPrintComCode()))//loginInfo.getPrintcom(strUser)))
{
statusDTO.setStrHasFtp("true");
}
} else {
statusDTO.setStrLoginType("SMC");
}
statusDTO.setStrStatus("init");
request.getSession().setAttribute(
"printStatusDTO",
statusDTO);
}
if (loginInfo.isPrintLogin(strUser)) {
return mapping.findForward("printPage");
} else {
return mapping.findForward("menuPage");
}
}
} catch (Exception e) {
e.printStackTrace();
}
switch (nReturn) {
case 1 :
{
strError = "database";
break;
}
case 2 :
{
strError = "user";
break;
}
case 3 :
{
strError = "password";
break;
}
case 4 :
{
strError = "userinvalid";
break;
}
}

// }
request.setAttribute("Error", strError);
return mapping.findForward("inputErrorPage");

}

private void getClientOSType(
String strOSInfo,
HttpServletRequest request) {
HttpSession session = request.getSession();
int iPosition;

//ネ。オテチスクィコナヨョシ莊トトレネン。」
iPosition = strOSInfo.indexOf("(");
if (iPosition > -1) {
strOSInfo = strOSInfo.substring(iPosition + 1, strOSInfo.length());
}

iPosition = strOSInfo.indexOf(")");
if (iPosition > -1) {
strOSInfo = strOSInfo.substring(0, iPosition);
}

if ((strOSInfo.indexOf("Window") > -1)
|| (strOSInfo.indexOf("Win2000") > -1)) {
session.setAttribute("OSType", "Window");
} else if (strOSInfo.indexOf("Linux") > -1) {
session.setAttribute("OSType", "Linux");
} else if (strOSInfo.indexOf("Mac") > -1) {
if (strOSInfo.indexOf("5.0") > 0)
session.setAttribute("OSType", "Mac9");
else if (strOSInfo.indexOf("5.23") > 0)
session.setAttribute("OSType", "Mac10");
}
}
}
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kingdax1 的回复:]
否定了这么多,还不如把logout和判断登陆的代码贴出来
[/Quote]

好。
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sdmrauquin 的回复:]
旁门方法。。。
logout 退出之后,多个中间页面,空的,仅仅多跳转一次。跳去首页。
这样在首页 点后退。也仅仅后退到中间页面,会执行这个中间页面跳转,又回去了首页
[/Quote]
试试。
crazylaa 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sdmrauquin 的回复:]

旁门方法。。。
logout 退出之后,多个中间页面,空的,仅仅多跳转一次。跳去首页。
这样在首页 点后退。也仅仅后退到中间页面,会执行这个中间页面跳转,又回去了首页
[/Quote]

可以如此:
logout仍然去servlet做注销之类,
完了转进到a.jsp
a.jsp的body的onload里面,或页面里面,直接
document.locatioin="login.jsp";
就算它后退到a.jsp,但是a.jsp一加载,马上又回到login.jsp了。
不过不知道用户狂点后退导致a.jsp都没加载会不会回去就需要试过才知道了。
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mars_ma_ok 的回复:]
我的想法是,在用户登录后再点logout 可以销毁当前的session,因为登录信息是保存在session中.销毁了session估计就可以了..
[/Quote]
是,这个方法是可以,但是走action以后,不是需要跳转么? 再跳转到登陆页面的时候,有一个异常,而且,不能登陆,就是登陆按钮没有事件了。
SDMRauquin 2010-05-11
  • 打赏
  • 举报
回复
旁门方法。。。
logout 退出之后,多个中间页面,空的,仅仅多跳转一次。跳去首页。
这样在首页 点后退。也仅仅后退到中间页面,会执行这个中间页面跳转,又回去了首页
Mars_Ma_OK 2010-05-11
  • 打赏
  • 举报
回复
我的想法是,在用户登录后再点logout 可以销毁当前的session,因为登录信息是保存在session中.销毁了session估计就可以了..
kingdax1 2010-05-11
  • 打赏
  • 举报
回复
否定了这么多,还不如把logout和判断登陆的代码贴出来
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ymdcr 的回复:]
如果都试过了
我觉得是浏览器的缓存。。。
[/Quote]
缓存都清理了,但是只是前一个页面的,如果再进一个子页面,一样可以进去。
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 q317621051 的回复:]
操作检查session 不行的话 页面里也可以检查session
[/Quote]

页面检查session? 如何做呢?给个实例吧?

谢谢。
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 crazylaa 的回复:]
<a href="#" onclick="parent.close();window.open('<%=path%>/login.jsp');"><font size="2">退出</font></a>

我这用了框架,所以parent.close();
window.open()里面的url可以是你后台处理的servlet。
如果不能弹出窗我就不知道了。。。
[/Quote]
这方法已经想到过,当场被否定! 谢谢。
牛叔 2010-05-11
  • 打赏
  • 举报
回复
如果都试过了
我觉得是浏览器的缓存。。。
zhai_xagloo 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ark032425 的回复:]
你把登录信息存那里了?
logout就清理登录信息。每次刷新页面去检查登录信息是否正确。
信息存到session或cookie中。
[/Quote]

貌似把登陆的用户名放到session里了。

q317621051 2010-05-11
  • 打赏
  • 举报
回复
操作检查session 不行的话 页面里也可以检查session
crazylaa 2010-05-11
  • 打赏
  • 举报
回复
还有就是在你的jsp里面最后面加上:
<script language="JavaScript">
if (top.location == self.location && opener) {
opener.location.replace("<%=path%>/login.jsp");
self.close();
}
else {
top.location.replace("<%=path%>/login.jsp");
}
alert("登录超时或者尚未登录,请重新登录!");
</script>

同时配置filter,过滤掉直接调用action/servlet的请求(session中没有正确信息的请求)。
加载更多回复(14)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧