java - 如何使用 servlet 为 Eclipse 中的所有 html 和 jsp 页面维护一个唯一的会话?
问题描述
我是 servlet 的新手。我正在创建一个小型动态 Web 应用程序。我想创建一个登录和注销模块,只有在正确登录的情况下才能访问其他 HTML 或 JSP 页面。在一些在线资源的帮助下,我创建了一个简单的登录和注销 HTML 及其 servlet。但是,如果我希望在成功登录后只有用户可以访问其他 HTML 或 JSP 页面,该怎么办。直接点击 URL 网址可能无法访问相同的 JSP 或 HTML 页面。
在下面的项目结构中,有一些 JSP 和 HTML 页面。假设我不想让用户在没有正确登录的情况下直接打开 ola.html 和 ola_create.jsp,那么我应该如何让它工作。请在下面查看我的项目结构:
下面是 servlet 的代码:
登录Servlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
String name=request.getParameter("name");
String password=request.getParameter("password");
if(password.equals("admin123")){
//response.sendRedirect("ola.html");
// out.print("Welcome, "+name);
HttpSession session=request.getSession();
session.setAttribute("name",name);
}
else{
out.print("Sorry, username or password error!");
request.getRequestDispatcher("login.html").include(request, response);
}
out.close();
}
}
LogoutServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
HttpSession session=request.getSession();
session.invalidate();
out.print("You are successfully logged out!");
out.close();
}
}
解决方案
您可以使用 Servlet 过滤器,在这种情况下,它主要用于执行过滤任务,例如转换、记录、压缩、加密和解密、输入验证等。
所以基本上它就像一个验证层,在你可以访问你的资源之前,它可以是一个 servlet、JSP 或 HTML 页面。例如,如果你使用 url-mapping /hello 创建一个过滤器,那么对于 /hello 的每个请求,首先过滤器将被执行。如果您的验证失败,您可以在此过滤器中验证用户是否登录,用户将不被允许访问 /hello 请求。
您可以在 web.xml 文件中定义类似的内容。
<filter>
<filter-name>f1</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/ola</url-pattern>
</filter-mapping>
这就是您定义过滤器的方式
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
public class MyFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
PrintWriter out=resp.getWriter();
out.print("filter is invoked before");
String user=request.getParameter("username");
if(user=="admin"){
chain.doFilter(req, resp);//sends request to next resource
}
else {
out.print("You are not authorized to view this page");
}
}
public void destroy() {}
}
附录-
推荐阅读
- python - 在 pandas 的另一个中创建一个具有值的新列
- javascript - HTTP 请求后 JSON 输入意外结束
- django - Django 管理员能够将图像上传到 S3 存储桶,但无法加载到模板上
- ios - 为具有多个部分的表视图创建搜索栏
- javascript - 如何通过调用 next(error) 来测试 express 中间件是否抛出错误
- c# - Asp.Net Core 3.1 MVC 客户端验证不适用于位于 Areas 文件夹中的视图
- python - python discord.py 二十一点游戏输了就会给硬币
- python - 使用烧瓶运行时找不到烧瓶模块错误
- angular - 是否可以在子窗口上订阅 observable?
- java - 隐藏我网站网址末尾的 .html