下面是关于“jsp实现登录验证的过滤器”的完整攻略:
一、过滤器的介绍
过滤器是Servlet 2.3版本之后新增的一种组件。其作用是在客户端发送请求到Servlet之前或者在Servlet响应客户端请求之后,对请求和响应进行拦截和处理。过滤器可以拦截多个Servlet,因此可以将与特定任务相关的处理放在一个过滤器中进行处理,提高程序的可维护性和可重用性。
二、过滤器的实现
在JSP中实现登录验证过滤器的过程,可以分为以下步骤:
1. 编写过滤器类
在Java Web应用程序的src目录下,新建一个名为LoginFilter.java的文件,编写过滤器类。具体代码如下所示:
package com.example.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 登录验证过滤器
*/
public class LoginFilter implements Filter {
private FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);// 获取当前请求所对应的会话,如果会话不存在则返回null
String uri = request.getRequestURI(); // 获取客户端请求的资源标识符(URI)
// 如果该请求是登录界面的请求,或者用户已经登录,则将请求交由下一个过滤器处理
if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
chain.doFilter(request, resp);
} else {
// 否则重定向到登录界面
resp.sendRedirect(request.getContextPath() + "/login.jsp");//有两个斜杠,一个斜杠表示的是项目根路径,第二个表示的是相对//。具体来说,/login.jsp实际上表示的是“当前Web应用程序的根路径/login.jsp”
}
}
@Override
public void destroy() {
this.config = null;
}
}
在该类中,我们重写了三个方法:
- init方法:在过滤器被初始化时调用,可以获取FilterConfig对象,该对象用于从web.xml文件中获取过滤器的初始化参数。
- doFilter方法:拦截客户端发送的HTTP请求和Servlet响应的HTTP请求,进行验证操作的核心逻辑在此方法中执行。
- destroy方法:在过滤器被销毁时调用,可以释放资源和进行清理操作。
2. 在web.xml文件中配置过滤器
在Java Web应用程序的web目录下,打开web.xml文件,在
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.example.filter.LoginFilter</filter-class>
<init-param>
<param-name>excludeUrls</param-name>
<param-value>.jsp,.js,.css</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
标签:定义一个过滤器。 标签:定义过滤器的名字。 标签:定义过滤器的类名。 标签:定义过滤器的初始化参数。 标签:定义需要拦截的URL模式。
3. 编写登录界面
我们需要在Java Web应用程序中编写一个用于登录验证的页面。页面中包含两个表单元素:username和password。具体代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/LoginServlet"
method="POST">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<input type="submit" value="Login">
</form>
</body>
</html>
4. 编写登录Servlet
我们需要在Java Web应用程序中编写一个Servlet,用于处理用户登录请求。具体代码如下所示:
package com.example.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "admin123".equals(password)) {
// 如果用户名和密码正确,创建一个新的会话
HttpSession session = request.getSession();
// 将用户信息存储到会话中
session.setAttribute("user", username);
// 将用户重定向到index.jsp页面
response.sendRedirect(request.getContextPath() + "/index.jsp");
} else {
// 如果用户名或密码错误,将用户重定向到登录界面并提示用户错误信息
response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
}
}
}
在该类中,我们重写了doGet方法和doPost方法,分别用于处理GET和POST请求。在处理POST请求时,我们获取用户名和密码,并进行验证。如果验证通过,将用户信息存储到会话中,然后将用户重定向到index.jsp页面。如果验证失败,将用户重定向到登录界面,并提示用户错误信息。
5. 编写index.jsp页面
我们需要在Java Web应用程序中编写一个index.jsp页面,用于展示用户信息。具体代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Index Page</title>
</head>
<body>
<h1>Welcome ${sessionScope.user}!</h1>
<a href="${pageContext.request.contextPath}/LogoutServlet">Logout</a>
</body>
</html>
在该页面中,我们使用EL表达式获取在会话中存储的用户信息,并用于展示用户信息的功能。同时,我们在页面中添加一个“Logout”链接,用于处理用户登出请求。
6. 编写登出Servlet
我们需要在Java Web应用程序中编写一个Servlet,用于处理用户登出请求。具体代码如下所示:
package com.example.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LogoutServlet
*/
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LogoutServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取当前请求所对应的会话
HttpSession session = request.getSession(false);
if (session != null) {
// 如果会话存在,则将会话失效
session.invalidate();
}
// 重定向到登录页面
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
在该类中,我们同样重写了doGet方法和doPost方法,分别用于处理GET和POST请求。在处理请求时,我们获取当前请求所对应的会话,并将会话失效。然后将用户重定向到登录页面。
三、示例说明
下面给出两个示例说明:
示例一
假设Java Web应用程序的安装路径为:C:/webapp,在该目录下新建一个名为“login.jsp”的文件,内容如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/LoginServlet"
method="POST">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<input type="submit" value="Login">
</form>
</body>
</html>
然后在该目录下新建一个名为“WEB-INF”的文件夹,该文件夹用于存放编译后的class文件和Web应用程序配置文件。在“WEB-INF”目录下新建一个名为“web.xml”的文件,配置如下所示:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">
<display-name>loginweb</display-name>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.example.filter.LoginFilter</filter-class>
<init-param>
<param-name>excludeUrls</param-name>
<param-value>.jsp,.js,.css</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.example.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.example.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/LogoutServlet</url-pattern>
</servlet-mapping>
</web-app>
在“src”目录下新建一个名为“com.example.filter”的包,该包用于存放过滤器类。在该包下新建一个名为“LoginFilter.java”的文件,内容如下所示:
package com.example.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 登录验证过滤器
*/
public class LoginFilter implements Filter {
private FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
String uri = request.getRequestURI();
if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
chain.doFilter(request, resp);
} else {
resp.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
@Override
public void destroy() {
this.config = null;
}
}
在“src”目录下新建一个名为“com.example.servlet”的包,该包用于存放Servlet类。在该包下新建一个名为“LoginServlet.java”的文件,内容如下所示:
package com.example.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "admin123".equals(password)) {
HttpSession session = request.getSession();
session.setAttribute("user", username);
response.sendRedirect(request.getContextPath() + "/index.jsp");
} else {
response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
}
}
}
在“src”目录下新建一个名为“com.example.servlet”的包,该包用于存放Servlet类。在该包下新建一个名为“LogoutServlet.java”的文件,内容如下所示:
package com.example.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class LogoutServlet
*/
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LogoutServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
在完成以上步骤后,将Java Web应用程序部署在Tomcat或其他Web服务器上,在浏览器中访问http://localhost:8080/login.jsp即可打开登录界面进行登录。登录成功后,将跳转到index.jsp页面并展示当前登录用户的用户名。在index.jsp页面中,点击“Logout”链接即可退出登录。
示例二
我们还可以进一步优化上面的示例一,让登录界面只有在用户尚未登录或登录失败时才显示错误信息。具体做法是在登录验证过滤器中添加一段代码,将与错误信息相关的会话属性从会话对象中删除。具体代码如下所示:
if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
if (session != null && session.getAttribute("loginError") != null) {
// 如果用户已经登录,或者登录失败但未进行重定向,则删除与错误信息相关的会话属性
session.removeAttribute("loginError");
}
chain.doFilter(request, response);
} else {
if (session != null) {
session.setAttribute("loginError", "Please login first.");
}
resp.sendRedirect(request.getContextPath() + "/login.jsp");
}
在登录Servlet中,我们同样需要删除与错误信息相关的会话属性。具体代码如下所示:
```
response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
session.setAttribute("loginError", "Username or password is incorrect
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp实现登录验证的过滤器 - Python技术站