简体   繁体   English

对不同的servlet使用一个会话属性

[英]use one session attribute for different servlets

I've made a login environment for a user, i've retrieved username and password from database for login.And set user name as a string in a session.now i want to use same user name for another servlet.But i can't use the same string in two servlet.How can i use the same session attribute for another servlet.Below is my code. 我已经为用户创建了登录环境,我已经从数据库中检索了用户名和密码进行登录。并将用户名设置为会话中的字符串。现在我想对另一个servlet使用相同的用户名。在两个servlet中使用相同的字符串。如何为另一个servlet使用相同的会话属性。下面是我的代码。 loginservlet

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet(urlPatterns = {"/LoginServlet"})
public class LoginServlet extends HttpServlet {

String userid, pwd;

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    Connection connection = null;
    Statement statement = null;

    userid = request.getParameter("uname");
    pwd = request.getParameter("pass");
    try {
        dbconnector dbc = new dbconnector();
        connection = dbc.Open();
        PreparedStatement ps = connection.prepareStatement("select * from member where uname='" + userid + "' and pass='" + pwd + "'");

        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            HttpSession session = request.getSession();
            session.setAttribute("userid", userid);
            //out.println("welcome " + userid);
            //out.println("<a href='logout.jsp'>Log out</a>");
            response.sendRedirect("success.jsp");
        } else {

            request.setAttribute("errorMessage", "Invalid user or password");
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
            rd.include(request, response);

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

profile servlet here i want to use the session value userid 我要在此处使用会话值userid的profile servlet

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;


@WebServlet(urlPatterns = {"/usesesvaluegetdbdata"})
public class usesesvaluegetdbdata extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
      Connection connection = null;
    Statement statement = null;
    String userid;

    try {
        dbconnector dbc = new dbconnector();
        connection = dbc.Open();
        PreparedStatement ps = connection.prepareStatement("select eid,ename from member where uname='" + userid + "' and pass='" + pwd + "'");



    } catch (Exception e) {
        e.printStackTrace();
    }

}

In first servlet you are storing value(s) in session like. 在第一个servlet您将像session那样存储值。

HttpSession session = request.getSession();
session.setAttribute("userid", userid);

In the same you need to retrieve those values from session in second servlet like 同样,您需要从第二个servlet session中检索这些值,例如

HttpSession session = request.getSession();
String userid=(String)session.getAttribute("userid");//cast to String, default its Object

Now use this userid variable in the second servlet . 现在,使用此userid在第二个变量servlet

HttpSession#getAttribute() HttpSession#getAttribute()

preparestatement follow like this to avoid sql injection 像这样准备preparestatement以避免SQL注入

session 会议

first store the value in session like this 首先像这样将值存储在会话中

HttpSession session = request.getSession();
session.setAttribute("userid", userid);

Access the session value like this 这样访问会话值

  HttpSession session=request.getSession();
  String username = session.getAttribute("userid").toString() ;

In the 'profile' servlet you can lookup HttpSession using following method. 在“配置文件” Servlet中,您可以使用以下方法查找HttpSession。

HttpSession httpSession = request.getSession( false ); HttpSession httpSession = request.getSession(false);

'false' will make sure you don't create new session in case profile servlet is called before login servlet. 如果在登录servlet之前调用了概要文件servlet,则“ false”将确保您不会创建新的会话。

Once you get the session you can read the value of attribute stored earlier. 一旦获得会话,就可以读取之前存储的属性值。

What do u meant by i can't use ? 我不能使用什么意思?

if u want to use stored value in other servlet do this HttpSession session = request.getSession(); 如果您想在其他servlet中使用存储的值,请执行此HttpSession session = request.getSession();。 String user= session.getAttribute("userid"); 字符串user = session.getAttribute(“ userid”);

if u want to use same key("userid") to set new value into it you cannot do that because session scope is common everywhere even if you create new session object you are using same session in background so you should choose new string. 如果您想使用相同的key(“ userid”)为其设置新值,则无法执行此操作,因为即使创建新的会话对象,会话范围在每个地方都是通用的,所以您在后台使用同一会话,因此应选择新的字符串。

try this .... 尝试这个 ....

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

@WebServlet(urlPatterns = {"/LoginServlet"})
public class LoginServlet extends HttpServlet {

    String userid, pwd;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Connection connection = null;
        Statement statement = null;

        userid = request.getParameter("uname");
        pwd = request.getParameter("pass");

    try {
        HttpSession session = request.getSession(true);//true if first session else use false
        if (SessionManager.checkUserSession(session)) {
            dbconnector dbc = new dbconnector();
            connection = dbc.Open();
            PreparedStatement ps = connection.prepareStatement("select * from member where uname='" + userid + "' and pass='" + pwd + "'");

            ResultSet rs = ps.executeQuery();
            if (rs.next()) {

                session.setAttribute("userid", userid);
                //out.println("welcome " + userid);
                //out.println("<a href='logout.jsp'>Log out</a>");
                response.sendRedirect("success.jsp");
            } else {

                request.setAttribute("errorMessage", "Invalid user or password");
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                rd.include(request, response);

            }
        }
        request.setAttribute("statuscode", "HTTP_STATUS_INVALID_SESSION");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

} }

code for sessionmanager sessionmanager的代码

public class SessionManager {

    public static boolean checkUserSession(HttpSession loginSession) {
        if ((loginSession == null) || (loginSession.toString().isEmpty())) {
            return false;
        } else if (loginSession.isNew()) {
            return false;
        } else {
            return true;
        }
    }
}

for changing the user name or accessing it use 用于更改用户名或访问它的使用

HttpSession session = request.getSession();
String userid=(String)session.getAttribute("userid"); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM