jsp实现登录验证的过滤器.docx
在Java Web开发中,过滤器(Filter)是一个强大的工具,它可以拦截请求并处理响应,用于实现各种功能,比如登录验证。本示例讲解了如何使用JSP和Servlet来实现一个登录验证过滤器,确保只有已登录用户才能访问特定的受保护资源。 1. **创建项目结构** 我们需要创建一个Dynamic Web Project,这是Java Web应用的基础。在这个项目中,我们会创建以下文件: - 1个Filter文件:LoginFilter.java - 1个Servlet文件:LoginServlet.java - 2个JSP文件:一个用于登录界面(login.jsp),另一个用于展示受保护内容(例如,welcome.jsp) 2. **LoginFilter.java** 登录过滤器的核心在于`doFilter`方法,它是Filter接口中的关键方法。在这个方法中,我们检查请求的URL,如果请求的是登录页面或登录Servlet,则放行;否则,我们检查HttpSession中是否存在名为"user"的属性,该属性通常表示用户已经登录。如果用户已登录,也放行;否则,返回提示信息并重定向到登录页面。 ```java @WebFilter(filterName = "loginFilter", urlPatterns = { "/*" }) public class LoginFilter implements Filter { // ...其他方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; // 获取session和设置响应类型与编码 HttpSession session = req.getSession(true); resp.setContentType("text/html;"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); // 获取请求URI和上下文路径,判断是否为登录相关页面 String request_uri = req.getRequestURI(); String ctxPath = req.getContextPath(); String uri = request_uri.substring(ctxPath.length()); if (uri.contains("login.jsp") || uri.contains("loginServlet")) { chain.doFilter(request, response); } else { // 验证用户是否已登录 if (session.getAttribute("user") != null) { chain.doFilter(request, response); } else { out.println("您没有登录,请先登录!3 秒后回到登录页面。"); resp.setHeader("refresh", "3;url=" + ctxPath + "/login.jsp"); return; } } } // ...其他方法 } ``` 3. **LoginServlet.java** 登录Servlet主要负责处理用户的登录请求,验证用户名和密码,并在验证成功后将用户信息存储到HttpSession中,以便LoginFilter进行后续的验证。 ```java @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); // 这里简化为硬编码的用户名和密码,实际应用中应连接数据库进行验证 if ("admin".equals(username) && "123456".equals(password)) { HttpSession session = request.getSession(); session.setAttribute("user", username); response.sendRedirect("/welcome.jsp"); // 登录成功,跳转到受保护页面 } else { response.sendRedirect("/login.jsp?error=1"); // 登录失败,返回登录页面并显示错误信息 } } } ``` 4. **配置web.xml** 虽然这个例子使用了注解配置过滤器,但在一些旧的项目中,你可能需要在web.xml文件中手动配置Filter。配置如下: ```xml <web-app> ... <filter> <filter-name>loginFilter</filter-name> <filter-class>filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ... </web-app> ``` 总结来说,通过创建和配置登录过滤器,我们可以确保只有已登录的用户才能访问受保护的资源,增强了应用程序的安全性。在实际开发中,登录验证通常是更复杂的过程,可能涉及会话管理、CSRF防护、密码加密等,但这个基础示例提供了一个理解过滤器工作原理的良好起点。