使用Servlet过滤器实现用户登录验证
2009-12-21 15:37
866 查看
在一个系统中,往往第一步就是让用户登录,根据用户读出权限,然后列出菜单供用户操作。用户登录后一般将其信息存储到session中,在其他的页面从session中读取用户信息,如果不存在,则表明用户并未登录,就跳转到登录页面要求用户登录。
如果不使用过滤器的话当然也可以实现,那就要在每一个页面添加验证信息,这样就很复杂,而且不利于管理。我们的宗旨是,只要是能够统一处理的,就一定要将这个功能作为公共模块提取出来。不多说,看代码。
Java代码
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语言
: 临时自用代码@代码发芽网
Xml代码
<
filter
>
<
filter-name
>
LogOrNot
</
filter-name
>
<
filter-class
>
Filters.LogOrNot
</
filter-class
>
<
init-param
>
<
param-name
>
LOGON_URI
</
param-name
>
<
param-value
>
log.jsp
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
HOME_URI
</
param-name
>
<
param-value
>
/model/
</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>
LogOrNot
</
filter-name
>
<
url-pattern
>
*.jsp
</
url-pattern
>
</
filter-mapping
>
Code Author:Jacy
.
其中两个配置参数就对应了Java文件中使用的参数log.jsp是登陆的视图页面,/model/是当前web应用的文件夹名称。mapping里面定义了对*.jsp进行过滤,如果程序中还有其他的页面,如.do或者.action等,那么可以继续添加<filter-mapping>
这个选项,其中<url-pattern>
就填写*.do或者*.action即可。
这样对所有的页面都可以进行过滤。当然还可以为应用配置其他的过滤器,Tomcat容器会根据web.xml文件中的配置顺序将其设置称过滤器链挨个处理,处理到最后一个跳转到处理页面进行处理。后面会再配置一个控制权限的过滤器。
如果不使用过滤器的话当然也可以实现,那就要在每一个页面添加验证信息,这样就很复杂,而且不利于管理。我们的宗旨是,只要是能够统一处理的,就一定要将这个功能作为公共模块提取出来。不多说,看代码。
Java代码
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();
}
}
}
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语言
: 临时自用代码@代码发芽网
Xml代码
<
filter
>
<
filter-name
>
LogOrNot
</
filter-name
>
<
filter-class
>
Filters.LogOrNot
</
filter-class
>
<
init-param
>
<
param-name
>
LOGON_URI
</
param-name
>
<
param-value
>
log.jsp
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
HOME_URI
</
param-name
>
<
param-value
>
/model/
</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>
LogOrNot
</
filter-name
>
<
url-pattern
>
*.jsp
</
url-pattern
>
</
filter-mapping
>
<filter> <filter-name>LogOrNot</filter-name> <filter-class>Filters.LogOrNot</filter-class> <init-param> <param-name>LOGON_URI</param-name> <param-value>log.jsp</param-value> </init-param> <init-param> <param-name>HOME_URI</param-name> <param-value>/model/</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogOrNot</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
Code Author:Jacy
.
其中两个配置参数就对应了Java文件中使用的参数log.jsp是登陆的视图页面,/model/是当前web应用的文件夹名称。mapping里面定义了对*.jsp进行过滤,如果程序中还有其他的页面,如.do或者.action等,那么可以继续添加<filter-mapping>
这个选项,其中<url-pattern>
就填写*.do或者*.action即可。
这样对所有的页面都可以进行过滤。当然还可以为应用配置其他的过滤器,Tomcat容器会根据web.xml文件中的配置顺序将其设置称过滤器链挨个处理,处理到最后一个跳转到处理页面进行处理。后面会再配置一个控制权限的过滤器。
相关文章推荐
- 使用Servlet过滤器实现用户登录验证
- Servlet 实现用户登录验证以及连接mysql数据库
- 使用break与cont实现验证用户登录信息
- 使用servlet实现用户登录
- Servlet实现用户的登录注册+sqlite数据库验证
- Java Web学习(30): 使用JSP+Servlet+JavaBean实现用户登录
- 详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)
- 使用AjaxPro框架实现无刷新用户登录验证【原创】
- 使用shiro的的表单过滤器重写shiro默认的认证规则来实现先验证验证码再验证登录所遇到的问题
- Ajax实现用户登录验证--原生JavaScript使用POST方法
- Servlet实现用户登录页面(通过数据库验证)
- JFinal学习笔记(三) 过滤器实现用户登录验证
- 详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)
- 利用Servlet和jsp实现客户端与服务器端的用户登录信息验证
- 使用Servlet和jdbc创建用户登录验证
- 使用SSH框架实现用户登录验证
- servlet+jsp实现过滤器,防止用户未登录访问
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- jsp使用servlet实现用户登录 及动态验证码