一个全局控制的监听器
来源:互联网 发布:不成乎名 编辑:程序博客网 时间:2024/05/01 21:10
一个全局控制的监听器
是否曾经想过要实现这样的网站功能:只有用户成功登陆系统以后,才可以访问网站的各个页面,如果用户通过输入网页的url直接访问网站的页面,则跳转到一个公共的错误页面,在这个页面中,提示用户这种访问操作是非法的。
要实现这个功能,你只需要在用户登录以后,将用户的用户名和密码保存到session中。当用户打开任何一个页面的时候,你只需要判断是否曾经保存过用户名和密码,如果曾经保存过,则说明用户是合法登陆用户,否则用户是非法访问用户。要是这么处理的话,虽然原理比较简单,但是操作起来有一定的难度,如果网站中有成百上千个网页,我们需要在每个网页中嵌入判断session中是否有用户名和密码的代码。则无疑增加了编程的复杂性,也加大了维护程序的复杂性。我们如果能够通过一个监听器来处理的话,问题就会变得简单的多。这个案例相对来说不是很简单,我们只是在下面简单的说明一下编程步骤和方法,具体描述略。
第一步,添加若干页面:
n index.jsp:网站首页,提供用户登录的页面,需要有包含用户名和密码的表单。
n 检查用户名和密码是否合法的servlet,取名为checklogin。
n main.jsp:用户登录成功以后,要显示的主页面,其中包含连接到子板块:文章板块(wenzhang.jsp)和论坛板块(bbs.jsp)的超链接
n wenzhang.jsp和bbs.jsp。
第二步:编写封装用户类的JavaBean(userName,password),User.java。
第三步,访问数据库,验证用户合法性的代码db.java:
package test; import java.sql.*; import java.util.*; public class db { Connection conn=null; public db(String dbName) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //设置数据库连接字符串 String strCon = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=" + dbName; //直接连接方式,连接数据库 conn = java.sql.DriverManager.getConnection(strCon, "", ""); } public boolean isUserOK(User u) throws Exception { String sql="select count(*) from 用户表 where 用户名=? and 密码=?"; PreparedStatement ps=conn.prepareStatement(sql); ps.setString(1,u.getUserName()); ps.setString(2,u.getUserName()); ResultSet rs=ps.executeQuery(); rs.next(); int i=rs.getInt(1); rs.close(); ps.close(); if(i>0) return true; else return false; } } |
第四步,编写servlet,验证用户,实现跳转:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter(); String name=request.getParameter("name"); String pwd=request.getParameter("pwd"); User u=new User(); u.setUserName(name); u.setPassword(pwd); String dbName=this.getServletContext().getRealPath("goods.mdb"); HttpSession session=request.getSession(); try { db d1 = new db(dbName); if(d1.isUserOK(u)) { session.setAttribute("Name",name); session.setAttribute("Password",pwd); } response.sendRedirect("main.jsp"); } catch (Exception ex) { out.println(ex.getMessage()); } } |
第五步:编写listener,防止用户非法访问网页,见mylistener.java。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { HttpServletRequest req=(HttpServletRequest)request; HttpSession session=req.getSession(); if(session.getAttribute("Name")==null | session.getAttribute("Password")==null) { //继续判断是否是首页,因为刚进首页的时候,session中一定没有保存用户名和密码信息 //另外在checklogin之前,session中也没有用户名和密码信息 String url=req.getRequestURL().toString(); if(!(url.endsWith("index.jsp")|url.endsWith("checklogin")|url.endsWith("/")|url.endsWith("error.jsp"))) { System.out.println(url); ((HttpServletResponse)response).sendRedirect("error.jsp"); return; } } filterChain.doFilter(request, response); } catch (ServletException sx) { filterConfig.getServletContext().log(sx.getMessage()); } catch (IOException iox) { filterConfig.getServletContext().log(iox.getMessage()); } } |
- 一个全局控制的监听器
- 监听器对全局用户的控制
- activiti全局的监听器和链接监听器
- 关于全局控制的使用
- 控制CEGUI的全局AutoRenderingSurface
- 全局控制NSLog的开关
- 对锁的全局控制
- java全局键盘监听器
- 处理乱码的一个监听器
- 一个TexitView的字数监听器
- LSNRCTL-命令行控制oracle的监听器
- 实现Java监听器全局监控
- 一个最简单的监听器实现
- 事件监听器模式(一个简单的例子)
- 一个监听器模式的消息管理器实现
- 一个通用的事件监听器函数
- 为自己的button添加一个监听器
- 编译选项的全局控制和局部控制
- 提问的智慧
- ajax与缓存的问题!
- Oracle数据库设计要做到五戒
- Blog第一篇
- LINUX下执行与定时执行ORACLE 存储过程
- 一个全局控制的监听器
- 分页的数据访问 (存储过程)
- 换个工作
- PHP手册翻译日记[3]
- jsf几个常用取值方法和技巧总结
- Ext.state.Manager.setProvider(new Ext.state.CookieProvider())
- 数据去除重复
- 解决mysql“Access denied for user 'root'@'localhost'”
- Ubuntu 8.04 解决flash方块字问题