Filter二(利用Filter实现简单的登录验证)
目标:1.我们规定利用Filter我们实现一个如果在Url中包含有admin的请求的时候,那么我们就要验证当前的用户是否登录,如果没有登录那么跳转到登录的界面
2.当我们登录成功的时候,我们应该跳回到我们之前请求的页面。
1.首先创建我们的LoginFilter
public class LoginFilter implements Filter{
private FilterConfig filterConfig ;
public void destroy() {
}
public void doFilter(ServletRequest serlvetRequest, ServletResponse serlvetResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) serlvetRequest ;
HttpServletResponse httpServletResponse = (HttpServletResponse)serlvetResponse;
HttpSession session = httpServletRequest.getSession();
User loginUser = (User)session.getAttribute(ConfigBean.session_login_user);
if(loginUser == null){
String url = httpServletResponse.encodeRedirectURL(httpServletRequest.getRequestURL().toString()) ;
//throw new NotLoginException(url);
httpServletResponse.sendRedirect(ConfigBean.getBasePath()+"error/Login.jsp returnUrl="+url);
}else{
filterChain.doFilter(serlvetRequest, serlvetResponse);
}
}
public void init(FilterConfig filerConfig) throws ServletException {
this.filterConfig = filerConfig ;
}
}
说明:1 .我们利用session去判断我们当前的用户是否是登录了,如果没有redirect登录的界面,同时我们要把我们当前访问的那个界面的url传入到登录的界面,这样在登录成功了,我们就可以返回到我们的请求的页面
2.我们登录的界面是Login.jsp
2.配置我们的DD
在下面的这段DD中:loginFilter com.filter.LoginFilter loginFilter /admin/* Login com.filter.Login Login /Login.do
我们规定了,那些Url的请求我们是要进行过滤的,如果你是有多个,那么有多个filter-mapping 标签就行了。loginFilter /admin/*
说明:当我们如果访问http://localhost:8887/Servlet/admin/requestAction.do 那么就会调转到我们登录的界面如图:

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+v8nS1L+0vPvO0sPHtcRVcmy12Na3tcS688PmzO2808HL0ru49lJldHVyblVybLXEss7K/TwvcD4KPHA+PGJyPgo8L3A+CjxoMj4zLrHg0LTO0sPHTG9naW4uanNwPC9oMj4KPHByZSBjbGFzcz0="brush:java;"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
说明:1.ConfigBean只是我的一个全局的类,里面包含了一些系统常用的参数,比如说我这里的basePath
2.我们把returnUrl 利用El表达式从param中取出来放到input 的隐藏域里面提交。
4.编写Login.do
String userName = req.getParameter("username");
String password = req.getParameter("password");
String returnUrl = req.getParameter("returnUrl");
System.out.println(returnUrl);
User user = new User();
user.setUserName(userName);
user.setPassword(password);
//login
HttpSession session = req.getSession();
session.setAttribute(ConfigBean.session_login_user, user);
if(returnUrl != null && returnUrl.trim().length() > 0 ){
resp.sendRedirect(returnUrl);
}else{
//返回 main.jsp 或者是Serlvet
}
当我们第二次请求(session 没用过期) 那么会直接访问到我们请求的Url地址 (请记住我们这里是拦截 url中含有/admin/的请求)
5.编写我们最开始请求的requestAction.do
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter pw = resp.getWriter() ;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pw.write("MH370");
pw.flush();
pw.close();
}
思考:1.有的时候我们是用ajax提交的登录的数据的,你可以把登录成功过后,returnUrl的地址放回到 success(data) ,data 中,然后利用js 去发起一个新请求.
2.我们现在看很多的网站的时候,有的登录界面是在页面上弹出一个 对话框去登录。(比如我们需要回复某一个帖子,那么可能需要你是登录的人才可以操作