Java Can';Don’不要从doGet调用doPost
当我直接呼叫doPost时,它会以正确的方式显示我的个人资料页面。但在登录后,我在Chrome copy url“”中打开了一个新选项卡,它显示了一个空白页面Java Can';Don’不要从doGet调用doPost,java,servlets,Java,Servlets,当我直接呼叫doPost时,它会以正确的方式显示我的个人资料页面。但在登录后,我在Chrome copy url“”中打开了一个新选项卡,它显示了一个空白页面 @WebServlet("/profile") public class Profile extends HttpServlet { **private String login;** private HttpSession httpSession; private User user; private Role role; public
@WebServlet("/profile")
public class Profile extends HttpServlet {
**private String login;**
private HttpSession httpSession;
private User user;
private Role role;
public static Logger LOGGER = LogManager.getLogger(Profile.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
httpSession = req.getSession();
try (PrintWriter out = resp.getWriter()) {
**if (httpSession.getAttribute("userLoggedIn") == null) {
out.println("<title>Login Page</title>");
out.println("<p><a href=\"index\">Please follow the link to login</a></p>");
} else {
login = (String) httpSession.getAttribute("uLogin");
doPost(req, resp);
}**
} catch (IOException | NullPointerException e) {
LOGGER.error(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
**login = req.getParameter("login");
user = new ImplUserDAO().findByLogin(login);**
httpSession = req.getSession();
resp.setContentType("text/html");
try (PrintWriter out = resp.getWriter()) {
out.println("<title>Profile page</title>");
if (user != null && user.getPassword().equals(req.getParameter("pass"))) {
role = new ImplRoleDAO().findById(user.getRoleId());
httpSession.setAttribute("userLoggedIn", true);
httpSession.setAttribute("uLogin",req.getParameter("login"));
httpSession.setAttribute("uPass",req.getParameter("pass"));
out.println("user id = " + user.getUserId());
out.println("login = " + user.getLogin());
out.println("password = " + user.getPassword());
out.println("role = " + role.getRoleName());
out.println("<form action=\"logout\" method=\"get\"/>" +
"<input type=\"submit\" value=\"Logout\"/>" +
"</form>");
if (role.getRoleName().equals("admin")) {
httpSession.setAttribute("isAdmin", true);
out.println("<a href=\"admin\">Go to admin page</a>");
}
} else {
out.println("Wrong login or password");
out.println("<a href=\"index\">Please follow the link to login</a>");
}
} catch (IOException | NullPointerException e) {
LOGGER.error(e);
}
}
}
@WebServlet(“/profile”)
公共类概要文件扩展了HttpServlet{
**私有字符串登录**
私有HttpSession HttpSession;
私人用户;
私人角色;
公共静态记录器Logger=LogManager.getLogger(Profile.class.getName());
@凌驾
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{
分别为setContentType(“文本/html”);
httpSession=req.getSession();
尝试(PrintWriter out=resp.getWriter()){
**if(httpSession.getAttribute(“userLoggedIn”)==null){
out.println(“登录页面”);
out.println(“”);
}否则{
login=(字符串)httpSession.getAttribute(“uLogin”);
doPost(请求、响应);
}**
}捕获(IOException | NullPointerException e){
错误(e);
}
}
@凌驾
受保护的void doPost(HttpServletRequest-req,HttpServletResponse-resp)引发ServletException,IOException{
**login=req.getParameter(“login”);
user=new ImplUserDAO().findByLogin(登录名)**
httpSession=req.getSession();
分别为setContentType(“文本/html”);
尝试(PrintWriter out=resp.getWriter()){
out.println(“个人资料页”);
if(user!=null&&user.getPassword().equals(req.getParameter(“pass”)){
role=newimproledao().findById(user.getRoleId());
setAttribute(“userLoggedIn”,true);
setAttribute(“uLogin”,req.getParameter(“login”);
httpSession.setAttribute(“uPass”,req.getParameter(“pass”);
out.println(“user id=“+user.getUserId());
out.println(“login=“+user.getLogin());
out.println(“password=“+user.getPassword());
out.println(“role=“+role.getRoleName());
out.println(“”)+
"" +
"");
if(role.getRoleName().equals(“admin”)){
setAttribute(“isAdmin”,true);
out.println(“”);
}
}否则{
out.println(“错误登录或密码”);
out.println(“”);
}
}捕获(IOException | NullPointerException e){
错误(e);
}
}
}
通过调用doPost()
您还可以执行这一行:
user = new ImplUserDAO().findByLogin(req.getParameter("login"));
它将抛出一个异常
或返回null
或任何东西,因为您的GET
请求没有包含该参数。如果要重用doPost()
,则需要从会话或请求获取登录名:
String login = req.getParameter("login");
if(null == login) {
login = (String)httpSession.getAttribute("uLogin");
}
或类似的
有关属性和参数的信息
在注释掉的代码中,您试图通过根据请求调用setAttribute(“login”…
来解决此问题。虽然这是合法的,但您不能通过调用getParameter()
来检索该值。相反,您必须调用'getAttribute()`同样-这与直接从会话检索没有多大区别:
//Retrieve Parameter (been send into the servlet from outside)
String login = req.getParameter("login");
if(null == login) {
//Retrieve Attribute you put into the request in doGet()
login = (String)req.getAttribute("login");
}
另一次编辑
您对req.getParameter(“pass”)
也有同样的问题
您应该认真考虑将登录过程(从请求中检查用户名/口令)从其他功能(显示配置页)或<强>反转< /强>您的逻辑:登录,将用户设置为“代码< > DOPSTOST()/代码>,如果成功调用<代码> GGET()/代码>
完整示例代码 考虑以下更改,在一定程度上修复您的逻辑:@WebServlet("/profile")
public class Profile extends HttpServlet {
// Don't use member variables on Servlets - they get reused for all users!
// private String login;
// private HttpSession httpSession;
// private User user;
// private Role role;
public static Logger LOGGER = LogManager.getLogger(Profile.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
HttpSession httpSession = req.getSession();
try (PrintWriter out = resp.getWriter()) {
if (httpSession.getAttribute("userLoggedIn") == null) {
out.println("<title>Login Page</title>");
out.println("<p><a href=\"index\">Please follow the link to login</a></p>");
}
else {
User user = httpSession.getAttribute("userLoggedIn");
Role role = httpSession.getAttribute("userRole");
out.println("<title>Profile page</title>");
out.println("user id = " + user.getUserId());
out.println("login = " + user.getLogin());
out.println("password = " + user.getPassword());
out.println("role = " + role.getRoleName());
out.println("<form action=\"logout\" method=\"get\"/>" +
"<input type=\"submit\" value=\"Logout\"/>" +
"</form>");
if("true".equals(httpSession.getAttribute("isAdmin")) {
httpSession.setAttribute("isAdmin", true);
out.println("<a href=\"admin\">Go to admin page</a>");
}
}
} catch (IOException | NullPointerException e) {
LOGGER.error(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String login = req.getParameter("login");
User user = new ImplUserDAO().findByLogin(login);
HttpSession httpSession = req.getSession();
try (PrintWriter out = resp.getWriter()) {
if (user != null && user.getPassword().equals(req.getParameter("pass"))) {
Role role = new ImplRoleDAO().findById(user.getRoleId());
httpSession.setAttribute("userLoggedIn", user);
httpSession.setAttribute("userRole", role);
if (role.getRoleName().equals("admin")) {
httpSession.setAttribute("isAdmin", true);
}
// Now refer to display part.
goGet(req, resp);
} else {
out.println("Wrong login or password");
out.println("<a href=\"index\">Please follow the link to login</a>");
}
} catch (IOException | NullPointerException e) {
LOGGER.error(e);
}
}
}
@WebServlet(“/profile”)
公共类概要文件扩展了HttpServlet{
//不要在servlet上使用成员变量-它们会被所有用户重用!
//私有字符串登录;
//私有HttpSession HttpSession;
//私人用户;
//私人角色;
公共静态记录器Logger=LogManager.getLogger(Profile.class.getName());
@凌驾
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{
分别为setContentType(“文本/html”);
HttpSession HttpSession=req.getSession();
尝试(PrintWriter out=resp.getWriter()){
if(httpSession.getAttribute(“userLoggedIn”)==null){
out.println(“登录页面”);
out.println(“”);
}
否则{
User=httpSession.getAttribute(“userLoggedIn”);
Role-Role=httpSession.getAttribute(“userRole”);
out.println(“个人资料页”);
out.println(“user id=“+user.getUserId());
out.println(“login=“+user.getLogin());
out.println(“password=“+user.getPassword());
out.println(“role=“+role.getRoleName());
out.println(“”)+
"" +
"");
if(“true”).equals(httpSession.getAttribute(“isAdmin”)){
setAttribute(“isAdmin”,true);
out.println(“”);
}
}
}捕获(IOException | NullPointerException e){
错误(e);
}
}
@凌驾
受保护的void doPost(HttpServletRequest-req,HttpServletResponse-resp)引发ServletException,IOException{
字符串login=req.getParameter(“login”);
User User=new ImplUserDAO().findByLogin(登录);
HttpSession HttpSession=req.getSession();
尝试(PrintWriter out=resp.getWriter()){
if(user!=null&&user.getPassword().equals(req.getParameter(“pass”)){
Role-Role=new improledao().findById(user.getRoleId());
setAttribute(“userLoggedIn”,user);
setAttribute(“用户角色”,角色);
if(role.getRoleName().equals(“admin”)){
setAttribute(“isAdmin”,true);
}