锁定老帖子 主题:用过滤器验证登陆框架,简单实例
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-28
过滤器的代码: public class SignOnFilter implements Filter{ FilterConfig fc; public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest hreq=(HttpServletRequest) request; HttpServletResponse hres=(HttpServletResponse) response; HttpSession session = hreq.getSession(); if(session!=null&&session.getAttribute("user")!=null)chain.doFilter(request, response); else if(hreq.getRequestURI().equals(hreq.getContextPath()+"/login.jsp")){ if(valid(hreq,hres)) hres.sendRedirect(hreq.getContextPath()+"/index.jsp"); else chain.doFilter(request, response); } else hres.sendRedirect(hreq.getContextPath()+"/login.jsp"); } public Boolean valid(HttpServletRequest hreq, ServletResponse hres){ String uName=hreq.getParameter("uName"); String uPassword=hreq.getParameter("uPasswd"); if(uName!=null&&uName.equals("admin")&&uPassword!=null&&uPassword.equals("admin")){ HttpSession session=hreq.getSession(); session.setAttribute("user", "admin"); return true; }else return false; } public void init(FilterConfig fc) throws ServletException { // TODO Auto-generated method stub this.fc=fc; } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>filter</display-name> <filter> <filter-name>signOnFilter</filter-name> <filter-class>lib.SignOnFilter </filter-class> </filter> <filter-mapping> <filter-name>signOnFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-28
有个问题
每次都要从数据库去验证一下的话 不会影响效率么 |
|
返回顶楼 | |
发表时间:2009-04-28
楼主 我有个问题
如果验证成功 可以继续进入其他的页面的 如果不成功 --> 就是你的第15行代码要实现什么呢... |
|
返回顶楼 | |
发表时间:2009-04-28
[quote="royzhou1985"]有个问题每次都要从数据库去验证一下的话不会影响效率么[/quote]
请教 |
|
返回顶楼 | |
发表时间:2009-04-28
最后修改:2009-04-28
binlaniua 写道
楼主 我有个问题
如果验证成功 可以继续进入其他的页面的 如果不成功 --> 就是你的第15行代码要实现什么呢...
是啊 |
|
返回顶楼 | |
发表时间:2009-04-29
最后修改:2009-04-29
第15行代码chain.doFilter(request, response);会进入到本来要去的页面,本程序会进入到login.jsp中。反之如果没有这行代码,你永远也到不了login.jsp。
下面我再对filter流程多做解释,比如假设我们有流程 list.jsp->delete.jsp list.jsp 是显示列表。 用户选择delete操作,就会到delete.jsp. 当我们加了filter的话,如果session中没有user,也就是用户没有登陆的时候,13-16行就会把用户带到login.jsp去,而不会去delete.jsp。 那么流程就变了,成了: list.jsp->delete.jsp ->login.jsp filter的作用是:如果用户登陆,就去delete.jsp. 如果用户没有登陆,就去login.jsp. 如果我们改写valid函数,那么可以做更加复杂的判断,如检查用户是否有删除的权限。当然,我们也可以再加另外一个filter,专门做权限判定。 把流程改为: list.jsp->delete.jsp ->login.jsp ->noright.jsp filter1的功能:用户没有登陆就去login.jsp,登陆了就chain.doFilter()进入下一个filter. filter2的功能:用户没有权限就去noright.jsp,否则就chain.doFilter()去到delete.jsp |
|
返回顶楼 | |
发表时间:2009-04-29
royzhou1985 写道 有个问题
每次都要从数据库去验证一下的话 不会影响效率么 你如果是用session("user")的状态来检查登陆与否的话,你没有必要每次都连接数据库。 如果你是到数据库中检查用户存在的话,你就要连接数据库。连不连接数据库和用不用filter没有关系,那要看你的验证代码是怎么写的。 把验证代码放在filter里面会简单一些。当然你也可以放到每个页面的最前面做登陆判断。效率上他们是一样的,因为都是执行验证代码,要不在filter里面执行,要不在页面或者控制模组里面执行。 |
|
返回顶楼 | |
发表时间:2009-04-29
最后修改:2009-04-29
一个系统要是没有权限判断,写起来是很快的,如果有权限,就会很复杂。应该要把权限判断独立出来,不要和主流程混在一起。
有两种办法比较好,一个是filter, 一个是aop。aop实现更加好,扩展性更强。但是如果原来的系统没有用到框架,有的甚至只是jsp页面。那么就只有用filter把权限判定加进去了。 我一个朋友就是有这么一套系统用jsp+jdbc写的,那么没有办法,只有用filter来的方便一些。否则他要在n个jsp前面加上判断确实麻烦。 |
|
返回顶楼 | |
发表时间:2009-04-29
最后修改:2009-04-29
不是吧 楼主...
我怎么看你的 13~16行 怎么有点不对劲(可能自己能力不足) 我大概说下我对你这13~16的见解.... ----------------------------------------- 1.进入了过滤器 2.判断session里面有没有这个user KEY对应的对象 2.1(有)该到哪就去哪..你自由了... 2.2(没有)再判断是否是从登陆界面过来的请求..(也就相当于第一次登陆了) 2.2.1(是的)然后判断请求过来的数据是否正确..正确后在session中存放一个userKEy 2.2.2(不是)@@@@最重要的就是这块..不是的时候为什么还让他继续往下走呢..难道还要后面的Action或者Servlet再来一次验证用户名是否正确吗....我的感觉是换成 response.setRedirect("回到登陆页面");当然之前最好加点提示用户..用户名或密码错误的信息因为你在filter里面已经验证过一次了。。。 |
|
返回顶楼 | |
发表时间:2009-04-30
最后修改:2009-04-30
binlaniua 写道 不是吧 楼主...
我怎么看你的 13~16行 怎么有点不对劲(可能自己能力不足) 我大概说下我对你这13~16的见解.... ----------------------------------------- 1.进入了过滤器 2.判断session里面有没有这个user KEY对应的对象 2.1(有)该到哪就去哪..你自由了... 2.2(没有)再判断是否是从登陆界面过来的请求..(也就相当于第一次登陆了) 2.2.1(是的)然后判断请求过来的数据是否正确..正确后在session中存放一个userKEy 2.2.2(不是)@@@@最重要的就是这块..不是的时候为什么还让他继续往下走呢..难道还要后面的Action或者Servlet再来一次验证用户名是否正确吗....我的感觉是换成 response.setRedirect("回到登陆页面");当然之前最好加点提示用户..用户名或密码错误的信息因为你在filter里面已经验证过一次了。。。 在这个程序中,如果你换成response.setRedirect("回到登陆页面")是一样的。但是以后,如果你有报错信息要加入进去呢,你如何处理?而用chain.doFilter(..), 你可以request.setAttribute("errMsg","你的信息有误");chain.goFilter(..); 当然你可以用request.getRequestDispatcher( ).forward()来达到目的,但是为什么不用chain呢?它有更多的可选性,尤其是下面还有其他的chain要运行的时候,比如登陆3次不成功就不让登陆了等等。 我的设计思路是我只控制逻辑的一边,比如 你说的2.2.2 login.jsp->login.jsp 我只管如果成功我把你带到index.jsp,如果不成功,你回你的老路。 各人都有自己的个性和习惯,你的也是对的。 |
|
返回顶楼 | |