我制作了一个具有登录和注销功能的网络应用。
我第一次登录和注销似乎很正常。
但是,当我更改另一个帐户并重复上述操作时,
注销操作直接跳转到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
答案 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();
}