how2j.cn


工具版本兼容问题
比如网站提供Hero查询服务,但是前提是用户要登录过才能使用。

如果用户登陆过了,访问listHero,就让用户正常访问,否则就跳转到登陆界面。

这是非常常见的场景,通过使用 session 来实现这个功能。

在处理登录的loginServlet 中使用将用户名保存在session中。

HeroListServlet 中查看session中是否为空。如果为空,就表示用户没有登陆过,就跳转到登陆页面


步骤 1 : 在LoginServlet 把验证成功的用户加入到 Session   
步骤 2 : 在HeroListServlet判断Session中是否有数据   

步骤 1 :

在LoginServlet 把验证成功的用户加入到 Session

edit
如果用户输入正确的账号密码,就跳转到 listHero,并且把用户名以"userName"放进session

如果用户输入错误的账号密码,就跳转到 login.html,让用户重新登陆
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); if ("admin".equals(name) && "123".equals(password)) { request.getSession().setAttribute("userName", name); response.sendRedirect("listHero"); } else { response.sendRedirect("login.html"); } } }
步骤 2 :

在HeroListServlet判断Session中是否有数据

edit
String userName = (String) request.getSession().getAttribute("userName");
if (null == userName) {
response.sendRedirect("login.html");
return;
}


从session中取出userName,如果是空,就表示用户没有登录,或者登录已经超过了30分钟。 客户端跳转到login.html,让用户重新登陆
package servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import bean.Hero; import dao.HeroDAO; public class HeroListServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } int start = 0; int count = 5; try { start = Integer.parseInt(request.getParameter("start")); } catch (NumberFormatException e) { // 当浏览器没有传参数start时 } int next = start + count; int pre = start - count; int total = new HeroDAO().getTotal(); int last; if (0 == total % count) last = total - count; else last = total - total % count; pre = pre < 0 ? 0 : pre; next = next > last ? last : next; request.setAttribute("next", next); request.setAttribute("pre", pre); request.setAttribute("last", last); List<Hero> heros = new HeroDAO().list(start, count); request.setAttribute("heros", heros); request.getRequestDispatcher("listHero.jsp").forward(request, response); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-04-04 登录报错500,显示loginServlet错误
17721521557



登录报错500,显示loginServlet错误 javax.servlet.ServletException:实例化servlet类LoginServlet时出错
已写的代码:
web.xml添加的部分:
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

HeroListServlet添加的部分:
    	/*
    	 * 在HeroListServlet判断Session中是否有数据,作为loginServlet的检测手段
    	 */
    	String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            response.sendRedirect("login.html");
            return;
            //从session中取出userName,如果是空,就表示用户没有登录,或者登录已经超
            //过了30分钟。 客户端跳转到login.html,让用户重新登陆
        }
    	
loginServlet:
public class LoginServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        String password = request.getParameter("password");
 
        if ("admin".equals(name) && "123".equals(password)) {
            request.getSession().setAttribute("userName", name);
            response.sendRedirect("listHero");
            //密码正确跳转至listHero.jsp
        } else {
            response.sendRedirect("login.html");
            //密码错误跳转到login.html
        }
 
    }
}

login.html
<!DOCTYPE html>
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
<form action="login" method="post">
请登录<br>
用户名:<input type="text" name="username"> <br>
密   码:<input type="password" name="password"> <br>
         <input type="submit" value="登录">
</form>

报错日志:
严重: Allocate exception for servlet LoginServlet
java.lang.ClassNotFoundException: LoginServlet

求解答
javax.servlet.ServletException: Error instantiating servlet class LoginServlet
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1139)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
	org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:745)


3 个答案

丽丽哒云儿 答案时间:2019-04-25
loginServlet 中getparameter("name")改成getparameter("username")

17721521557 答案时间:2019-04-10
谢谢,就是这个问题,不报错了,但我改动之后并不能跳转至listHero界面,代码还有什么问题吗

做菜的英雄 答案时间:2019-04-08
<servlet-class>LoginServlet</servlet-class> 这里类的路径确认一下



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-12-12 1、login.html和web.xml部分。2、用户登出代码如何编写
唏嘘不已



1、login.html和web.xml部分如代码。 2、用户登出代码如何编写?
login.html:
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<form action="login" method="post">
	账号 : <input type="text" name="name"> <br>
   	密码 : <input type="text" name="password"> <br>   	
    <input type="submit" value="登陆">
</form>

web.xml(添加):
	<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

							


3 个答案

now2iava 答案时间:2019-04-30
销毁需要判断username是否为空,但是跳转就不需要判断了吧,反正当前有无用户,登出都是回到登陆界面的。

神奇的海螺 答案时间:2019-04-18
Pylory的第二步很好,第一步我觉得应该是直接销毁掉Session而不是把当前Session里被绑定的username这个object给消除掉。 相关方法见 https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html 里的 invalidate()

Pylory_二刷h2j 答案时间:2019-01-25
登出我是这样想的,不知道有没有毛病



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-01 登陆无法跳转
2017-11-08 private static final long serialVersionUID = 1L;这句话有什么意义吗?
2017-09-16 为什么我在html里面输入admin,123还是跳转到html页面?
2017-08-04 老师好。请问这种方法判断用户是否登录是不是只能应对只有1个用户的情况?
2017-07-30 老师好,请问下session的问题。
2017-07-19 数据库中数据无法显示
2017-06-30 最后为什么要加return,我试了好像加不加都能转发,求解答
2017-03-06 登录已经超过了30分钟跳转问题
2016-10-14 HeroListServlet里面的逻辑看不懂
2016-05-13 希望有个验证权限的Filter




提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-MVC-用户是否登陆 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 1001964108
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图