一.案例--登录验证
* 需求:
1. 浏览器访问case案例(服务器)的资源时。验证其是否登录
2. 如果登录了,则直接放行。
3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
二.功能分析
三.代码的编写
由于前面的登录页面已经完成(前几篇博客),所以我们需要做的就是编写一个Filter类,来过滤用户通过浏览器访问服务器的页面,增强其功能。
过滤器首先要判断浏览器访问的资源是否是与登录页面相关的资源
》》》》如果浏览器访问的页面不是login.jsp页面或者checkloginservlet,以及与登录页面相关的资源时,则需要判断当前用户是否登录:(可以根据Session域中是否有user属性来判断,因为在登录页面时,如果登录成功后,会在checkloginservlet中把User的信息存储到Session中)
判断用户是否登录:可以根据Session域中getAttribute("user")来判断是否存在
如果存在,则Filter中执行chain.doFiltere(req,resp),放行
如果不存在,则跳转到登录页面,并setAttribute("msg",“提示用户未登录”);
》》》如果访问的资源页面是登录页面,则直接在Filter中执行chain.doFiltere(req,resp),放行
代码:(Filter类)
package web;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@WebFilter("/*")
public class Filter implements javax.servlet.Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//1.获取资源请求的路径,强制转换
HttpServletRequest req= (HttpServletRequest)request;
String rString=req.getRequestURI();
//2.有些资源需要放行
if(rString.contains("/login.jsp")||rString.contains("/checklogin")||rString.contains("/checkcode")||
rString.contains("/css/")||rString.contains("/js/")||rString.contains("/fonts/")) {
chain.doFilter(req, response);
}
else { //3.当访问其他资源,就判断是否登录
Object obj=req.getSession().getAttribute("user"); //一般登陆成功后会用session封装存储用户,这个就是判断依据
if(obj!=null) { //如果有,则放行
chain.doFilter(request, response);
}
else { //如果没有,则跳转到登录界面
req.setAttribute("log_msg", "您还没有登录,请先登录!");
req.getRequestDispatcher("/login.jsp").forward(req, response);
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}