2016-06-10 50 views
-2

会话中存在问题。 在create.html中,当我点击createdepartment时,createdepartment.jsp页面打开后,我复制它的url1后,我提交的数据,我再次复制url2,然后我注销后注销时,我粘贴url2在浏览器中,它给消息,请首先登录并打开login.html,但是当我在浏览器中粘贴url1时,会打开它,但它不应该。这是为什么发生? 我已经给出了代码,请有人纠正它?在servlet中构建会话时出错

LoginServlet.java

package bean; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
public class LoginServlet extends HttpServlet { 
    @Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
     try (PrintWriter out = response.getWriter()) { 
      request.getRequestDispatcher("link.html").include(request, response); 


      String name=request.getParameter("name"); 
      String password=request.getParameter("password"); 
      boolean status=false; 
    try{ 
     Connection con=ConnectionProvider.getCon(); 
     String sql="select * from roles where name='" + name + "' and pass='" + password + "'"; 
     PreparedStatement stmt =con.prepareStatement(sql); 
     String role="admin";       
     ResultSet rs=stmt.executeQuery(); 
     if(rs.next()) 
     { 
      status=true; 
      role=rs.getString("role"); 
     } 

     if(status){ 
     out.print("Welcome, "+name); 
     HttpSession session=request.getSession(); 
     session.setAttribute("name",name); 
     if(role!=null && role.equals("admin")){ 

     request.getRequestDispatcher("create.html").include(request, response); 

     } 
     else { 

     request.getRequestDispatcher("create1.html").include(request, response); 

     } 

    } 
    else{ 
     out.print("Sorry, username or password error!"); 
     request.getRequestDispatcher("login.html").include(request, response); 
    } 
    }catch(SQLException | ServletException | IOException e){} 


     } 
} 



} 

create.html上

<a href="LogoutServlet">Logout</a> 
<a href="department.jsp">Create Department</a> 
<a href="c_user.jsp">Create Users</a> 
<hr/> 

department.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 


<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>JSP Page</title> 
</head> 
<body> 

    <h1>Create Department</h1> 
<br> 
<form action="DepartmentServlet"> 
    <table border="1"> 
     <tbody> 
      <tr> 
       <td>Company Name :</td> 
       <td><input type="text" name="company" value="" size="50" /></td> 
      </tr> 
      <tr> 
       <td>Department Name</td> 
       <td><input type="text" name="department" value="" size="50" /> </td> 
      </tr> 
      <tr> 
       <td>Head Office :</td> 
       <td><input type="text" name="place" value="" size="50" /></td> 
      </tr> 

     </tbody> 
    </table> 
    <input type="reset" value="Clear" name="Clear" /> 
    <input type="submit" value="Submit" name="Submit" /> 

</form> 

</body> 
</html> 

DepartmentServlet.java

package bean; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 


public class DepartmentServlet extends HttpServlet { 



@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html"); 
    try (PrintWriter out = response.getWriter()) { 
      request.getRequestDispatcher("link.html").include(request, response); 

      HttpSession session=request.getSession(false); 
      if(session!=null){ 
       String name=(String)session.getAttribute("name"); 
       boolean status=false; 
    try{ 
     String department=request.getParameter("department"); 
     String company=request.getParameter("company"); 
     String place=request.getParameter("place"); 

     Connection con=ConnectionProvider.getCon(); 
     String sql="insert into department(departmentname,company,place) values (?,?,?)"; 
     PreparedStatement pstmt =con.prepareStatement(sql); 

     pstmt.setString(1,department); 
     pstmt.setString(2,company); 
     pstmt.setString(3,place); 

     int rs=pstmt.executeUpdate(); 
     if(rs>0){status=true;} 
    }catch(Exception e){} 
       if(status){ 
       out.print("Values have been inserted,"+name); 
       request.getSession();} 
       else 
       { 
        out.print("failed"); 
       }      
       request.getRequestDispatcher("department.jsp").include(request, response); 
      } 
      else{ 
       out.print("Please login first"); 
       request.getRequestDispatcher("login.html").include(request, response); 
      } 
     } 
    } 

    } 

Logout.Servlet

package bean; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
public class LogoutServlet extends HttpServlet { 
      @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 
       try (PrintWriter out = response.getWriter()) { 
        request.getRequestDispatcher("link.html").include(request, response); 

        HttpSession session=request.getSession(); 
        session.invalidate(); 

        out.print("You are successfully logged out!"); 
       } 
} 
} 
+0

我的名字是'富” UNION SELECT '管理员' FROM DUAL --',也许你错过了第2张照片在你的[上一个问题]意见(http://stackoverflow.com/questions/37699810/comparing-values-while-插入) – 2016-06-10 05:38:28

+0

准备好的语句评论??如果是的,我改变了它 – Andy

+0

你错过了准备好的陈述点,请阅读http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html – 2016-06-10 06:03:55

回答

0

LogoutServlet.java代码可能有问题。

您还没有提及它的代码。

注销过程包括2个重要的东西..

  1. (通过使session.invalidate();)卸下连接到会话对象
  2. 创建会话对象为空的所有属性 这样做会资格垃圾收集和对象(存储在堆内存中的对象)的引用被删除(引用存储在堆栈中)。

在你的情况,我想(因为LogoutServlet.java是不存在的),最有可能发生错误的原因是 “你可能会创建一个新的会话对象,然后将复制的参考旧会话对象,现在您将通过“session.invalidate();”删除此新会话。

上述过程删除新引用,但旧引用仍旧存在,因为它的副本在新对象中可用删除不是原来的。

如需更多具体和正确的答案,请附上您的LogoutServlet.java源代码。

+0

我做了。我已经编辑的代码 – Andy

+0

我没有一个Twitter帐户这里的logoutservlet是我的电子邮件ID - [email protected] – Andy

0

您的注销servlet应该有request.getSession(false)..这将不会返回新的会话,如果一个已经存在..也清除您的浏览器缓存之前运行它。

HttpSession session = request.getSession(false); 会议。无效();