论坛首页 入门技术论坛

用过滤器验证登陆框架,简单实例

浏览 13168 次
该帖已经被评为新手帖
作者 正文
   发表时间: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>




用户只要更改valid函数,就能对用户名和密码进行验证。比如到数据库中取用户数据核对等等。

以这个登录验证类为例,我们可以书写其他过滤器来对表单输入做更加多的判断,增添更多的流程。如实现权限控制等等。

过滤器在web中设置,filterMapping键可以控制你的过滤器作用到那些uri。

由于过滤器有能力访问HttpServletRequest,HttpServletResponse, 因此有了他,你可以对用户的操作response.sendRedirect或者
hreq.getRequestDispatcher(url).forward(request, respoonse),以此来达到改变用户操作的目的。

当然你也可以在request中加入新的属性,以便被链上的jsp使用。

要注意的是每个过滤器在Web Server中只加载一次,所以不要在他的属性里面存储request,或
session域的东西。

整个源代码8.6k,用eclipse导入,就可以运行了。
这个实例的功能就是当访问网站的任何页面时(除login.jsp本身),如果用户没有登陆,就转登陆页面

源代码下载

   发表时间:2009-04-28  
有个问题
每次都要从数据库去验证一下的话
不会影响效率么
0 请登录后投票
   发表时间:2009-04-28  
楼主  我有个问题


如果验证成功 可以继续进入其他的页面的
如果不成功 -->  就是你的第15行代码要实现什么呢...

0 请登录后投票
   发表时间:2009-04-28  

[quote="royzhou1985"]有个问题每次都要从数据库去验证一下的话不会影响效率么[/quote]

 

请教

0 请登录后投票
   发表时间:2009-04-28   最后修改:2009-04-28
binlaniua 写道
楼主  我有个问题


如果验证成功 可以继续进入其他的页面的
如果不成功 -->  就是你的第15行代码要实现什么呢...

 

 是啊

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2009-04-29  
royzhou1985 写道
有个问题
每次都要从数据库去验证一下的话
不会影响效率么


你如果是用session("user")的状态来检查登陆与否的话,你没有必要每次都连接数据库。
如果你是到数据库中检查用户存在的话,你就要连接数据库。连不连接数据库和用不用filter没有关系,那要看你的验证代码是怎么写的。

把验证代码放在filter里面会简单一些。当然你也可以放到每个页面的最前面做登陆判断。效率上他们是一样的,因为都是执行验证代码,要不在filter里面执行,要不在页面或者控制模组里面执行。
0 请登录后投票
   发表时间:2009-04-29   最后修改:2009-04-29
一个系统要是没有权限判断,写起来是很快的,如果有权限,就会很复杂。应该要把权限判断独立出来,不要和主流程混在一起。

有两种办法比较好,一个是filter, 一个是aop。aop实现更加好,扩展性更强。但是如果原来的系统没有用到框架,有的甚至只是jsp页面。那么就只有用filter把权限判定加进去了。

我一个朋友就是有这么一套系统用jsp+jdbc写的,那么没有办法,只有用filter来的方便一些。否则他要在n个jsp前面加上判断确实麻烦。
0 请登录后投票
   发表时间: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里面已经验证过一次了。。。

0 请登录后投票
   发表时间: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,如果不成功,你回你的老路。

各人都有自己的个性和习惯,你的也是对的。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics