Java过滤器(设置检查用户是否登陆,只有登陆才能访问其他网页,一直跳转登陆页面的问题)

学习了Java 中的过滤器,了解到过滤器执行的三个步骤:

 1: 可以每次在浏览器访问服务器的时候提前进行一次预处理

 2:调用下一个过滤器或者网页

 3:离开目标资源/响应后再进行一次处理。

问题出现:

我的项目可以登陆、查询数据库的数据、显示登陆成功的信息

由于有一些缺陷:可以根据url访问登录后的数据信息,所以需要添加过滤器,来判断是否登陆,只有登陆了有了User信息才能访问其他的页面,设置了过滤器之后,发现只有登陆成功后的第一个页面可以正常访问,点击其他的直接跳转到登陆页面。

 

自查后考虑过后,觉得问题出现在这里:

  我每个功能后面都添加了request.setAttribute("User",user);但是每次执行过滤器 中的条件  request.getAttribute("User")

都判断了User为空,所以跳转到了登陆界面。

 

总结了一下:

   因为页面还没有执行,所以每个功能的request.setAttribute()的语句根本还没有执行,过滤器就已经开始进行判断了。

   这个时候我们需要考虑到Session,Session是可以在同一个服务器下进行数据共享的,所以过滤器只需要判断:

request.getSession().getAttribute("User"),只要通过Session来进行判断,并且登陆成功的第一个功能里设置

request.getSession().setAttribute("User",user)这样就能够实现只要登陆了,session便能够存储用户,只要浏览器未关闭,Session便一直存在。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个常见的Web开发的功能,我可以给你提供一个Java Servlet的示例代码,实现用户登录过滤器的功能: ```java import java.io.IOException; 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 { @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if (isValidUser(username, password)) { User user = new User(username, password); // 创建一个用户对象 HttpSession session = request.getSession(); session.setAttribute("user", user); // 把用户对象放入session中 response.sendRedirect("home.jsp"); // 登录成功,跳转到主页 } else { response.sendRedirect("login.jsp?error=1"); // 登录失败,跳转登录页面并提示错误 } } private boolean isValidUser(String username, String password) { // TODO: 在这里实现验证用户名和密码是否正确的逻辑 return true; // 这里简单地返回true,表示任何用户都可以成功登录 } } ``` 上面的代码实现了一个Servlet,用于处理用户登录请求。当用户提交了用户名和密码后,服务器会调用 `isValidUser` 方法来验证用户是否合法。如果合法,则创建一个 `User` 对象,把它放入 `Session` 中,并且跳转到主页。如果不合法,则返回登录页面,并且带上一个错误参数 `error=1`,用于在页面上显示错误信息。 接下来,我们编写一个过滤器,用于检查用户是否登录: ```java 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.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里可以进行一些初始化操作,比如读取配置文件等 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; HttpSession session = req.getSession(false); if (session == null || session.getAttribute("user") == null) { resp.sendRedirect("login.jsp"); // 没有登录或者Session过期,跳转登录页面 } else { chain.doFilter(request, response); // 已经登录,继续处理请求 } } @Override public void destroy() { // 这里可以进行一些清理操作,比如关闭数据库连接等 } } ``` 上面的代码实现了一个过滤器,用于检查用户是否登录。在每个请求到达服务器之前,都会先经过这个过滤器。如果用户没有登录或者 `Session` 已经过期,就会跳转登录页面。否则,就继续处理请求。 在 `web.xml` 配置文件中,我们需要把这个过滤器登录Servlet进行关联: ```xml <filter> <filter-name>LoginFilter</filter-name> <filter-class>mypackage.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>mypackage.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> ``` 上面的代码将 `LoginFilter` 过滤器映射到所有的URL上,表示所有的请求都会经过这个过滤器。同时,把 `LoginServlet` 映射到 `/login` 这个URL上,表示处理登录请求的Servlet。 这样,当用户访问任何页面时,都会经过 `LoginFilter` 这个过滤器。如果用户没有登录,则会被重定向到登录页面;否则,就继续处理请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值