jsp直接跳转到html而不是通过servlet

时间:2018-04-07 13:30:23

标签: java jsp session servlets httpsession

我制作了一个具有登录注销功能的网络应用。

我第一次登录和注销似乎很正常。

但是,当我更改另一个帐户并重复上述操作时,

注销操作直接跳转到index.html而不是

LogoutServlet.java。因此会话仍然有效。

你知道原因吗?

我很感激你告诉我原因。

我的密钥代码如下。

LoginServlet.java

HttpSession session = request.getSession(false);
        if(session!=null) 
            session.setAttribute("LoginUser", user);
        request.getRequestDispatcher("/WEB-INF/jsp/home.jsp")
                   .forward(request, response);

home.jsp

<a href="Logout.action">Logout</a>

LogoutServlet.java

@WebServlet("/Logout.action")
protected void doGet(...) {
    HttpSession session = request.getSession(false);
    if(session!=null) {
        session.removeAttribute("LoginUser");
        session.invalidate();
    }
    request.getRequestDispatcher("/index.html").forward(request, response);
}

您可以在我的网站上试用。 http://anwuli.cn/HelloWorld

提供了2个测试帐户。

格式:用户名和密码

首先:admin&amp; 123456

第二名:anpeng&amp; 123456

2 个答案:

答案 0 :(得分:1)

您正在使用LoginServlet.java,因此您无法在class RegistrationController extends Controller{ public function createTypeValidationRules($types){ $rules = array(); foreach( $types as $typeName ){ $type = TicketType::where('name', $typeName)->firstOrFail(); $rules[$type->name] = 'between:'.$type->min.','.$type->max } return $rules; } public function storeQuantity(Request $request){ $typeQuantities = $request->get('types'); $rules = $this->createTypeValidationRules(typeQuantities); $validator = Validator::make($typeQuantities,$rules); if ($validator->fails()) { //do whatever you want in case of error here.. return false; } $total = 0; foreach($typeQuantities as $typeName => $quantity){ $type = TicketType::where('name', $typeName)->firstOrFail(); $price = $type->price; $selectedTypes[$type->name]['quantity'] = $quantity; $selectedTypes[$type->name]['price'] = $price; $selectedTypes[$type->name]['subtotal'] = $price * $quantity; } return view('congresses.registration')->with('selectedTypes', $selectedTypes); } 中创建任何会话。

您在哪里创建第一次会话?

答案 1 :(得分:1)

正如之前的回答所提到的那样。如果在检查是否存在以下会话时不存在,则不会创建新会话:

request.getSession(false)

因此,当登录帐户尝试注销时,if块不为真:

 if(session!=null) {
        session.removeAttribute("LoginUser");
        session.invalidate(); // this code never runs...
    }

您需要使用:

HttpSession session = (request.getSession());

HttpSession session =  request.getSession(true)

此外,只要新用户连接到您的网站,即使他们尚未登录,也会创建会话。

所以你需要检查属性是否为null:

 if(null == session.getAttribute("LoginUser")){  
         //no logged in user
         RequestDispatcher rd=request.getRequestDispatcher("login.jsp"); //replace with your login page  
           rd.forward(request,response);    
           return;
    }else{
         //user attribute is not null so logout
        session.invalidate();
     }