解释一下 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req =(HttpServletRequest) request; HttpServletResponse resp =(HttpServletResponse) response; HttpSession session = req.getSession(); User user =(User) session.getAttribute("user"); String uri= req.getRequestURI(); if(user==null&&!uri.endsWith("login")&&!uri.endsWith("login.jsp")) { String path = req.getServletContext().getContextPath(); System.out.println(path); resp.sendRedirect(path+"/client/login.jsp"); } else{ chain.doFilter(request, response); } }
时间: 2024-02-22 09:01:04 浏览: 130
这段代码是一个 Java Web 应用程序中的过滤器,用于过滤客户端请求。在客户端请求被处理之前,它会拦截请求并检查当前用户是否已经登录。如果用户未登录,则会将请求重定向到登录页面。否则,请求将继续被处理,直到响应返回给客户端。具体来说,代码中的 doFilter 方法会获取当前请求的 HttpServletRequest 和 HttpServletResponse 对象,然后从 HttpServletRequest 对象中获取 HttpSession 对象和当前登录的用户信息。如果用户未登录且请求不是登录页面或登录请求,则将请求重定向到登录页面。否则,将请求和响应对象传递给 FilterChain 对象的 doFilter 方法,以便继续处理该请求。
相关问题
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(false); String path = req.getRequestURI().substring(req.getContextPath().length()).replaceAll("[/]+$", ""); boolean loggedIn = (session != null && session.getAttribute("account") != null); boolean allowedPath = ALLOWED_PATHS.contains(path); if (loggedIn || allowedPath) { chain.doFilter(req, res); } else { String script = "<script>location.href='login/login.jsp';alert('还未登录,请登录!')</script>"; res.getWriter().println(script); } }
这是一个 Java Web 中的过滤器(Filter),用于拦截用户的请求并进行权限控制。该过滤器的作用是:如果用户未登录且访问的不是允许访问的路径,则重定向到登录页面并提示用户进行登录。如果用户已经登录或访问的是允许访问的路径,则继续执行后续操作。
具体实现逻辑如下:
1. 首先获取请求的 HttpServletRequest 对象和响应的 HttpServletResponse 对象。
2. 通过 HttpServletRequest 对象获取用户的 Session 对象,判断用户是否已经登录。
3. 获取请求的路径,并判断该路径是否在允许访问的路径列表 ALLOWED_PATHS 中。
4. 如果用户已经登录或请求的路径是允许访问的路径,则继续执行后续操作,即调用 FilterChain 对象的 doFilter 方法,将请求和响应对象传递给下一个过滤器或 Servlet。
5. 如果用户未登录且请求的路径不是允许访问的路径,则重定向到登录页面并提示用户进行登录。具体实现是通过 HttpServletResponse 对象的 getWriter 方法获取响应输出流,并输出一段 JavaScript 代码,将页面重定向到登录页面并弹出提示框。
该过滤器的实现可以有效地保护 Web 应用程序的安全性,防止非法用户进行未授权的访问。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); // 得到用户请求的URI // 得到web应用程序的上下文路径 // 去除上下文路径,得到剩余部分的路径 String uri = req.getRequestURI().substring(req.getContextPath().length());//请求的页面 String url=req.getHeader("referer");//之前的页面 if(req.getSession().getAttribute("patient")==null&&patient.contains(uri)){ req.getSession().setAttribute("message","请先登录!"); req.getSession().setAttribute("url",url); // System.out.println(req.getSession().getAttribute("url")); HttpServletResponse resp= (HttpServletResponse) servletResponse; resp.sendRedirect("login.jsp"); }else { filterChain.doFilter(servletRequest, servletResponse); } }
这个过滤器的 doFilter() 方法是过滤器的核心方法,用于对请求进行过滤和拦截。该方法接收一个 ServletRequest 对象、一个 ServletResponse 对象和一个 FilterChain 对象作为参数。
在该方法中,首先将 ServletRequest 对象强制转换为 HttpServletRequest 对象,然后设置请求和响应的字符编码为 utf-8,并设置响应的内容类型为 text/html;charset=utf-8,以保证中文字符能够正确显示。
接着,通过 HttpServletRequest 对象获取用户请求的 URI,并去除上下文路径,得到剩余部分的路径。然后,通过 HttpServletRequest 对象获取请求头中的 referer 字段,即之前的页面。
接下来,进行判断:如果用户未登录且请求的 URI 在 patient 列表中,则将一个提示信息和之前的页面的 URL 存放在 HttpSession 对象中,并进行页面的重定向,跳转到登录页面(login.jsp);否则,将请求和响应对象传递给 FilterChain 对象的 doFilter() 方法,继续执行后续的过滤器。
阅读全文