Servlet登录注册

用Servlet+Velocity实现最傻的登录、注册,还有登录验证:如果检查发现没有登录那么不准许查看某个web页面

遇到的问题是:

1.怎样获得session

request.getSession()和request.getSession(isNew)两种方式。google了一下发现有人认为request.getSession(false)才是稳妥,理由是能避免重复创建session节省内存。

我按这种方式写了测试代码,直接访问页面,发现在不同浏览器表现不一样,而且HttpServlet和VelocityViewServlet的表现也不一样:-

#VelocityViewServlet

chrome:org.apache.catalina.session.StandardSessionFacade@27675d26

ie:直接报空指针错

vivaldi:org.apache.catalina.session.StandardSessionFacade@6bfb4540

firefox:直接报空指针错

#HttpServlet

chrome\firefox\vivaldi正常

ie还是报空指针错误

后来看了so上一个问题的解答,说带false参数的方法一般是在filter中使用,而登录的servlet中用不带参数的就好了,ref:

http://stackoverflow.com/questions/14557435/request-getsessionfalse-not-returning-null-after-calling-session-invalidate


把so这个问题答案中代码复制并修改,实现了注册、登录、查看个人信息(通过filter验证是否登录)、注销功能。


2.VelocityViewServlet类分别处理Get和Post请求

其实既然使用了VelocityViewServlet,就没有必要使用原来的HttpServlet了。

因为VelocityViewServlet是继承了HttpServlet的,需要修改的地方override方法就好了。

默认doGet和doPost方法都调用doRequest方法,它会调用handleRequest方法。因此无论是get还是post方式的请求,默认都要调用handleRequest方法。只要override这个方法,就能处理自己的业务逻辑了。

但是有时候同一个页面,比如登录页面,get方式和post方式得到的内容应该是不一样的,也就是需要分开处理。因为post处理成功的话,url会改变,而handleRequest不会改变url,因此要重写post方法,改变url的操作使用request.sendRedirect(request.getContextPath()+relatetive_path)。

也即是说:对于一个VelocityViewServlet,它处理请求的时候,哪种请求方式需要改变url,就override那种请求方法。(一般都是重写doPost方法)

如果说doPost方法中有「不需要改变url」的情况,那么就调用doGet方法好了,比如登录失败,那么在request中设定某个attribute为错误提示,然后转交给doGet方法;doGet方法中取出这个attribute然后放入ctx,然后在模版文件中使用。


当然前期好多代码还是看了博客园的一篇教程改出来的:http://www.cnblogs.com/tzhz/archive/2013/05/18/3085512.html


工程下载:http://pan.baidu.com/s/1mgsWDUo

你可能感兴趣的:(Servlet登录注册)