使用Servlet过滤器实现用户登录验证

在一个系统中,往往第一步就是让用户登录,根据用户读出权限,然后列出菜单供用户操作。用户登录后一般将其信息存储到session中,在其他的页面从session中读取用户信息,如果不存在,则表明用户并未登录,就跳转到登录页面要求用户登录。

如果不使用过滤器的话当然也可以实现,那就要在每一个页面添加验证信息,这样就很复杂,而且不利于管理。我们的宗旨是,只要是能够统一处理的,就一定要将这个功能作为公共模块提取出来。不多说,看代码。

Java代码
  1. package  Filters; import  javax.servlet.FilterChain;  
  2. import  javax.servlet.FilterConfig;  
  3. import  javax.servlet.ServletRequest;  
  4. import  javax.servlet.ServletResponse;  
  5. import  javax.servlet.http.HttpServletRequest;  
  6. import  javax.servlet.http.HttpServletResponse;  
  7. import  java.io.*;  
  8. import  javax.servlet.*;  
  9. import  javax.servlet.http.*;   
  10.   
  11. public   class  LogOrNot  implements  javax.servlet.Filter {  
  12. private  FilterConfig config;  
  13. private  String logon_page;  
  14. private  String home_page;  
  15. public   void  destroy() {  
  16. config = null ;  
  17.   
  18. }  
  19. public   void  init(FilterConfig filterconfig)  throws  ServletException {  
  20. // 从部署描述符中获取登录页面和首页的URI   
  21. config = filterconfig;  
  22. logon_page = filterconfig.getInitParameter("LOGON_URI" );  
  23. home_page = filterconfig.getInitParameter("HOME_URI" );  
  24. System.out.println(home_page);  
  25. if  ( null  == logon_page ||  null  == home_page) {  
  26. throw   new  ServletException( "没有找到登录页面或主页" );  
  27. }  
  28. }  
  29.   
  30. public   void  doFilter(ServletRequest request, ServletResponse response,  
  31. FilterChain chain) {  
  32. HttpServletRequest req = (HttpServletRequest) request;  
  33. HttpServletResponse rpo = (HttpServletResponse) response;  
  34. javax.servlet.http.HttpSession session = req.getSession();  
  35.   
  36. try  {  
  37. req.setCharacterEncoding("utf-8" );  
  38. catch  (Exception e1) {  
  39. e1.printStackTrace();  
  40. }  
  41. String userId = (String) session.getAttribute("UserId" );  
  42. String request_uri = req.getRequestURI().toUpperCase();// 得到用户请求的URI   
  43. String ctxPath = req.getContextPath();// 得到web应用程序的上下文路径   
  44. String uri = request_uri.substring(ctxPath.length()); // 去除上下文路径,得到剩余部分的路径   
  45. try  {  
  46. if  (request_uri.indexOf( "LOGIN.JSP" ) == - 1  && request_uri.indexOf( "LOG.JSP" ) == - 1  && userId ==  null )  
  47. {  
  48. rpo.sendRedirect(home_page+logon_page);  
  49. System.out.print(home_page+logon_page);  
  50. return ;  
  51. }  
  52.   
  53. else  {  
  54. chain.doFilter(request, response);  
  55. }  
  56. catch  (Exception e) {  
  57. e.printStackTrace();  
  58. }  
  59. }  
  60.   
  61. }  
package Filters;import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*; 

public class LogOrNot implements javax.servlet.Filter {
private FilterConfig config;
private String logon_page;
private String home_page;
public void destroy() {
config = null;

}
public void init(FilterConfig filterconfig) throws ServletException {
// 从部署描述符中获取登录页面和首页的URI
config = filterconfig;
logon_page = filterconfig.getInitParameter("LOGON_URI");
home_page = filterconfig.getInitParameter("HOME_URI");
System.out.println(home_page);
if (null == logon_page || null == home_page) {
throw new ServletException("没有找到登录页面或主页");
}
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse rpo = (HttpServletResponse) response;
javax.servlet.http.HttpSession session = req.getSession();

try {
req.setCharacterEncoding("utf-8");
} catch (Exception e1) {
e1.printStackTrace();
}
String userId = (String) session.getAttribute("UserId");
String request_uri = req.getRequestURI().toUpperCase();// 得到用户请求的URI
String ctxPath = req.getContextPath();// 得到web应用程序的上下文路径
String uri = request_uri.substring(ctxPath.length()); // 去除上下文路径,得到剩余部分的路径
try {
if (request_uri.indexOf("LOGIN.JSP") == -1 && request_uri.indexOf("LOG.JSP") == -1 && userId == null)
{
rpo.sendRedirect(home_page+logon_page);
System.out.print(home_page+logon_page);
return;
}

else {
chain.doFilter(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

 Code Author:Jacy .

这里对上面的代码稍作解释:过滤器从配置文件中读出配置选项,一个是登陆页面的url地址,另外一个是web应用的url,之所以要这样做,是因为 如果程序中有iframe的话,登陆页面会默认在iframe中打开,因此这里将使用绝对地址进行跳转;判断语句中要将login.jsp和 log.jsp排除,因为这两个是处理登陆的页面,若不排除将出现循环重定向;检查session中的userid选项,当然也可以设置其他的,关键看 session中存的是什么了,若有,则递交给下一个过滤器,若不再有过滤器,则提交给处理页面,若未登陆,则跳转到登陆页面。

代码写好后,就需要在web应用的web.xml文件中进行配置。filter其实就是一种Servlet,因此配置方法和Servlet是一样的。代码如下:

Xml代码
  1. < filter >   
  2. < filter-name > LogOrNot </ filter-name >   
  3. < filter-class > Filters.LogOrNot </ filter-class >   
  4. < init-param >   
  5. < param-name > LOGON_URI </ param-name >   
  6. < param-value > log.jsp </ param-value >   
  7. </ init-param >   
  8. < init-param >   
  9. < param-name > HOME_URI </ param-name >   
  10. < param-value > /model/ </ param-value >   
  11. </ init-param >   
  12. </ filter >   
  13. < filter-mapping >   
  14. < filter-name > LogOrNot </ filter-name >   
  15. < url-pattern > *.jsp </ url-pattern >   
  16. </ filter-mapping >   
 Code Author:Jacy .

其中两个配置参数就对应了Java文件中使用的参数log.jsp是登陆的视图页面,/model/是当前web应用的文件夹名称。mapping里面定义了对*.jsp进行过滤,如果程序中还有其他的页面,如.do或者.action等,那么可以继续添加<filter-mapping> 这个选项,其中<url-pattern> 就填写*.do或者*.action即可。

这样对所有的页面都可以进行过滤。当然还可以为应用配置其他的过滤器,Tomcat容器会根据web.xml文件中的配置顺序将其设置称过滤器链挨个处理,处理到最后一个跳转到处理页面进行处理。后面会再配置一个控制权限的过滤器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值