首先我们有一个需求:当用户访问某个资源,需要先登录才能访问
拿到需求后我们先要编写一个User实体类。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
private String password;
}
再编写userService接口
public interface userService {
// 登录操作
boolean Login(User user);
}
其次编写userServiceImpl实现类
public class userServiceImpl implements userService {
public boolean Login(User user) {
if (user.getUsername().equals("admin")&&user.getPassword().equals("admin")){
return true;
}
return false;
}
}
再编写一个Servlet
@WebServlet(value = "/login")
public class LoginServlet extends HttpServlet {
private com.lcp.service.userService userService;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
userService = new userServiceImpl();
if (!StringUtils.isNullOrEmpty(username)&& !StringUtils.isNullOrEmpty(password)){
// if (userService.Login(new User(username,password))) {
// req.getRequestDispatcher("/page/Home.html").forward(req, resp);
req.getSession().setAttribute("user",new User(username,password));
req.getRequestDispatcher("/page/Home.html").forward(req,resp);
}
}
}
下面就需要编写过滤器了。再编写之前我们先了解一下。
过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来 。
滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求;在请求到达Servlet/JSP之前,过滤器截获请求。
过滤器中常用的是Filter接口。
Filter接口是过滤器类必须实现的接口,该接口中有三个方法:
1.init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次,参数FilterConfig可以获得filter的初始化参数;
2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法,方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
3.destroy():该方法在容器销毁对象前被调用。
下面我们就来实现一下
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 用户名不为空,就能访问page下的资源
if (request.getSession().getAttribute("user")!=null){
chain.doFilter(request,response);
}else {//用户名为null,跳转到登录界面
response.sendRedirect("/HelloFilter/login.html");
}
}
public void destroy() {
}
}
<filter>
<filter-name>filter</filter-name>
<filter-class>com.lcp.config.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/page/*</url-pattern>
</filter-mapping>
这时访问http://localhost:8888/HelloFilter/page/Home.html跳转到登录界面,登录成功后,跳转到Home界面。再次访问http://localhost:8888/HelloFilter/page/Home.html直接跳转,不用登录。